REGEX:获取字符串中不在块引用内的所有单词

时间:2014-04-28 20:32:56

标签: php regex

请看一下:

http://ideone.com/Mszb8z

$content = 'Hello I am Tom and I am <blockquote class="quotedText">another Tom inside a quote</blockquote>';

$pattern = '#Tom#';
$matches = array();
preg_match_all($pattern, $content, $matches);

var_dump($matches);

这会返回Tom个字符串。但我只想要Tom字符串不在块引用标记内。在这种情况下,只应返回一个Tom字符串。怎么做?

1 个答案:

答案 0 :(得分:2)

这个正则表达式适合你:

<blockquote[^>]*>[^<]*</blockquote>(*SKIP)(?!)|Tom

<强>演示:

<?php
$string = 'Hello I am Tom and I am <blockquote class="quotedText">another Tom inside a quote</blockquote>';
$regex="~<blockquote[^>]*>[^<]*</blockquote>(*SKIP)(?!)|Tom~";
$count = preg_match_all($regex,$string,$m);
echo $count."<br />";
print_r($m[0]);
?>

输出

1 // means there is only one match
Array ( [0] => Tom ) 

<强>解释

  1. |替换的左侧,我们匹配整个blockquote,我们知道我们不想要。 (?!)迫使正则表达式失败并在Tom在blockquote中匹配时回溯。引擎回溯到(*SKIP),告诉它放弃到目前为止的整个比赛,并在字符串的下一个位置尝试新的匹配。
  2. 在交替的右侧,我们现在可以安全地匹配Tom。
  3. 感谢Hamza指出,不是跳过包含&#34; Tom&#34;的块引用块,而是跳过任何块引用块。