preg_match搜索

 <?php 
$ content =“
{php
{php 1 php}

{php 2 php}
{php 3 php}

nphp}“;

</ code> </ pre>

如何获得4个字符串?</ p>

首先:</ p>

  {php 1 php} 
{php 2 php}
{php 3 php}
</ code> </ pre>

第二名:</ p>

  <代码> 1 
</代码> </ PRE>

第三:</ p>

 <代码> 2 
</代码> </ PRE>

四:</ p>

  3 
</ code> </ pre>
</ div>

展开原文

原文

<?php
$content = "
{php
    {php 1 php}
    {php 2 php}
    {php 3 php}
php}"; 

How I can get 4 strings?

First:

{php 1 php}
{php 2 php}
{php 3 php}

Second:

1

Third:

2

Four:

3

douben1891
douben1891 是的,在这种受限制的HTML上使用正则表达式没什么不好。看看OP的历史,甚至可能是他真的,真的需要正则表达式(他正在研究某种模板引擎)。但是必须在问题中明确提到-绝大多数人因为要求HTML解析正则表达式而需要一个DOM解析器。让他们理解这一点有时候是一场斗争,在这里回答的人都厌倦了这场斗争,这会导致不友好(有时甚至不公平)的反应
接近 10 年之前 回复
dqkxo44488
dqkxo44488 我放弃了:你的链接不是我想的那么傻。诚然,问题往往无法传达完整的情况。当你说人们懒得使用解析器时,那里有懒惰和懒惰。我称为避难者是懒惰的,因为他们(可能)通过避免解析器为自己做更多的工作,而不是更少。对于我的实际工作,我总是使用它们,因为我每周都会解析成千上万的随机HTML页面。有时候我会在我自己的样板上使用正则表达式:它写得更快+安全,因为它受到限制,因为无数的外星人页面永远不可能。我也比许多人更加“重复”。
接近 10 年之前 回复
dongyuan2388
dongyuan2388 然而,看看OP的问题历史,我已经准备好承认这可能不是这里的情况-他似乎正在构建更大更复杂的东西
接近 10 年之前 回复
donglin8467
donglin8467 看看我的第一个链接。它解释了在合理讨论中的权衡。如果你想为每一个“我不会解释我正在做什么,但我想用正则表达式解析HTML”的问题开始一个合理的讨论,那就是我的客人。另外,请查看问题的第一个修订版,其中OP使用HTML作为示例。用例正是构建DOM解析器的用例。通常人们只是懒得使用它,而宁愿让某人为他们建立一个正则表达式,因为它需要更少的努力
接近 10 年之前 回复
dtc9222
dtc9222 有时这个建议是100.00000000%的钱,但通常不是。人们只是嘲笑一些短暂的副词,好像它是一个神圣的诫命,这是不公平的。这里应该有更多的资源,而不是在合理的讨论中更好地解释权衡。如果不告诉人们为什么以及为什么这么做就告诉别人该怎么做是不友善的。没有一个答案适合所有情况。
接近 10 年之前 回复
duanaoyuan7202
duanaoyuan7202 我在这个答案中使用递归来查找带有降序数字的数字。我正在努力让人们在正则表达式上使用他们所有的软件工程技能,正如他们任何其他代码一样:用于分组,缩进,认知分块的空白;评论;问题分解和自上而下编程与语法正则表达式;和in-regexsubs的字母名称。
接近 10 年之前 回复
doubi12138
doubi12138 事实上,我经常使用它们只是为了上面这样的例子,为一个简单的案例构建一个解析器。只有形成它们的正则表达式相当复杂并且困扰很多人,所以需要在代码中做好评论。
接近 10 年之前 回复
douyan4900
douyan4900 那是真的。递归正则表达式没有错。他们工作得非常棒!
接近 10 年之前 回复
douyinmian8151
douyinmian8151 这完全无关紧要。在这个意义上没有人使用REGULAR。自从肯·汤普森(KenThompson)在40年前对其进行反馈以来,正则表达式并不常见。而不是REGULAR,它们是有用的,实用的和强大的。/(.)\1/是一个ispofact事实上不是REGULAR语言的正则表达式。大交易!没有人再使用REGULAR正则表达式了。
接近 10 年之前 回复
duanlu2935
duanlu2935 你能用更多的描述性标题吗?你以前的问题似乎都或多或少都有同样无意义的标题。
接近 10 年之前 回复
dqj29136
dqj29136 所以你不是要解析HTML,而是现在完全不同的东西?您有机会将数据转换为HTML/XML吗?因为那时你可以使用DOM解析器
接近 10 年之前 回复
douchi7073
douchi7073 如果你坚持使用preg_match(),那么你很可能需要使用递归正则表达式。请参阅:php.net/manual/en/regexp.reference.recursive.php
接近 10 年之前 回复
duanbi7247
duanbi7247 您的更改不会更改问题。正则表达式只能解析常规语言。
接近 10 年之前 回复
douye9175
douye9175 我改变了第一篇文章。现在帮帮我
接近 10 年之前 回复
dongrou2920
dongrou2920 没有野心也要改变标题â€
接近 10 年之前 回复
duanchi6397
duanchi6397 您不能使用正则表达式解析HTML。你应该使用DOMParser
接近 10 年之前 回复

2个回答



虽然您可以使用简单的计数器轻松解析此类输入,但可以使用递归正则表达式来获取所需内容。 一个简单的(?)正则表达式验证</ em>输入将是:</ p>

  ^({php \ s *(\ d + + |(?1)+  )\ s * php} \ s *)$ 
</ code> </ pre>

(?1)</ code>是一个递归匹配,它试图匹配第一个 再次组,这是另一个 {php ... php} </ code>标记。 我们在 php </ code>之间也有一个捕获组来捕获它们的内容。</ p>

在你的情况下你想要捕获重叠的结果(事实上,甚至包含在其中的结果) 其他结果)。 这甚至不那么漂亮,但仍然可以使用前瞻。 环视可以有捕获组,因此模式将是:</ p>

 (?=({php \ s *(\ d + + |(?1)+)\ s *  php} \ s *))
</ code> </ pre>

结果有两个额外捕获的组 - 环顾四周的空白结果,以及外部的整个标记 {php ... php} </ code>,但是如果您使用 PREG_PATTERN_ORDER </ code>,您的预期结果将位于第三个位置( [2] </ code>):</ p>

  [2] =&gt; 数组

[0] =&gt; {php 1 php}
{php 2 php}
{php 3 php}
[1] =&gt; 1
[2] =&gt; 2 \ n [3] =&gt; 3

</ code> </ pre>

这是一个更复杂的例子: http://ideone.com/sWWrT </ p>

现在,必须谨慎。 正如我之前所说,通过一个简单的深度计数器,它更具可读性和可维护性,除了娱乐用途之外,你真的不需要正则表达式。</ p>
</ div>

展开原文

原文

While you could easily parse such input with a simple counter, it is possible to use a recursive regex to get what you want. A simple (?) regex to validate the input would be:

^({php\s*(\d+|(?1)+)\s*php}\s*)$

(?1) is a recursive match, it tries to match the first group again, which is another {php ... php} token. We also have a capturing group between the phps to capture their content.

In your case you want to capture overlapping results (in fact, even results contained within other results). This is even less pretty, but still possible, using a look-ahead. Look-around can have capturing groups, so the pattern would be:

(?=({php\s*(\d+|(?1)+)\s*php}\s*))

The result has a two extra captured groups - blank results for the look around, and the whole token with the outer {php ... php}, but if you use PREG_PATTERN_ORDER your expected results will be on the third postion ([2]):

[2] => Array
(
    [0] => {php 1 php}
           {php 2 php}
           {php 3 php}
    [1] => 1
    [2] => 2
    [3] => 3
)

Here's a bit more complex example: http://ideone.com/sWWrT

Now, the mandatory word of caution. As I've said earlier, this is much more readable and maintainable with a simple depth counter, you don't really need a regex here, beyond recreational use.

dongqing344716
dongqing344716 嗯,现在尝试一下,使用$ regex =“〜(\ d +)(?(?{(strlen($ 1)== 3)})cat)〜”; 针对000cat,我得到preg_match():编译失败:断言后预期(?(偏移8处...我在PCRE CMake文件中看不到标注选项,但他们可能已将其关闭了......或者 这可能是单一的。:)
大约 6 年之前 回复
donglu5047
donglu5047 不,我没有。
大约 6 年之前 回复
doumenshi1475
doumenshi1475 您是否曾经知道通过PCRE的preg_接口是否可以使用代码标注?
大约 6 年之前 回复
dounouxi1020
dounouxi1020 - 谢谢! 我相信这与许多口味提供的e旗帜相同。 我对此并不熟悉,因为我从来没有机会使用它 - 我对PHP,Perl或Python几乎一无所知。 而且,我错了 - 一个计数器可以采取一个平衡的令牌,但不是在所有级别上收集它们。 无论哪种方式,我都认为这对代码块来说不那么有趣。
接近 10 年之前 回复
doujie7886
doujie7886 “recreational regexes” - 我喜欢它! 干得好,谢谢。 说到深度计数器,您是否熟悉PCRE的标注机制? 我想知道PHP是否以某种方式使用了它; 你知道答案吗? 它(或多或少)对应于Perl的(?{ - })正则表达式代码转义。 您可以在条件模式的COND部分使用标注(?(COND)YES_PATTERN | NO_PATTERN)来查看深度计数器。 (COND)也可以是递归测试,如(R),(R1),(R2)或(R&NAME)。 这不需要标注支持。
接近 10 年之前 回复



  $ regex = preg_match_all(“/({php(\ d +)php})+ /”,$ content);

$ regex [0] [0] ==“{php 1 php}”;
$ regex [0] [1] ==“{php 2 php}”;
$ regex [0] [2] ==“{php 3 php}”;
end($ regex)[0] ==“1”;
end($ regex)[1] ==“2”;
end($ regex)[2] = =“3”;
</ code> </ pre>

正在寻找这样的东西?</ p>
</ div>

展开原文

原文

$regex = preg_match_all("/({php (\d+) php})+/", $content);
$regex[0][0] == "{php 1 php}";
$regex[0][1] == "{php 2 php}";
$regex[0][2] == "{php 3 php}";
end($regex)[0] == "1";
end($regex)[1] == "2";
end($regex)[2] == "3";

Looking for something like this?

dsaf32131
dsaf32131 答案也很好。 我认为人们真的不明白解析HTML实际上是多么困难。 您是否知道规则解析器和有用的解析器之间存在巨大差异? 那是因为那里有所有糟糕的HTML。 人们根本不知道它到底有多难。 如果我的哦,你可以张贴风,用作为什么你不应该尝试的演示,我根本不介意。 我写它来显示硬度。
接近 10 年之前 回复
doudu4282
doudu4282 您可以在这个问题上享受我的参考问题:stackoverflow.com/questions/3650125 / ...阅读讨论并转到Mario的答案
接近 10 年之前 回复
dongzuo9096
dongzuo9096 公平点。 但如果我上帝的声音中的讽刺不明显(可能不是!),我需要继续努力! :)我会想到一些事情。
接近 10 年之前 回复
duanqian2278
duanqian2278 上帝的声音Thou-Shalt-对我可能没有被破坏的眼睛来说并不是很难。 我确实同情长时间的疲劳,因为每天都有同样的老问题。 我真的希望有明确的资源可用演示字符串在HTML或XML上使用正则表达式是有意义的。 这些案件确实存在,尽管我认为它们必须属于少数。
接近 10 年之前 回复
dsirr48088
dsirr48088 :没有人有意思或攻击性,他们告诉他使用XML解析器来解析HTML而不是正则表达式,这是完全正确的。
接近 10 年之前 回复
duandeng7132
duandeng7132 很难知道他想要什么,因为他编辑了问题的内容,因为人们是卑鄙的并且跳过了他。 也许他会更好地解释,但我不能说如果他被吓坏了我会感到惊讶。 不知道为什么,但今天我觉得自己很软弱; 对于那些真正想学会被推开的人来说,我感觉很糟糕。
接近 10 年之前 回复
dqqs64238
dqqs64238 我不是那样做的吗? 还是我完全忽略了这一点?
接近 10 年之前 回复
dqstti8945
dqstti8945 为什么不向他展示递归正则表达式? 我这样做但我的母语是Perl,我还没有弄清楚如何知道给定的php实现链接到哪个版本的PCRE。 (¿ÊouÊžÎpoqÎuÉƨəop)PCRE在其正则表达式中与头部 - 尾部递归的规则略微但略有不同,而不是Perl,并且我害怕这样做 错误道。 谢谢!
接近 10 年之前 回复
dongmi4720
dongmi4720 我认为他也想要抓住嵌套的案例。
接近 10 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问