请看一下:
$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
字符串。怎么做?
答案 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 )
<强>解释强>
|
替换的左侧,我们匹配整个blockquote,我们知道我们不想要。 (?!)
迫使正则表达式失败并在Tom在blockquote中匹配时回溯。引擎回溯到(*SKIP)
,告诉它放弃到目前为止的整个比赛,并在字符串的下一个位置尝试新的匹配。感谢Hamza指出,不是跳过包含&#34; Tom&#34;的块引用块,而是跳过任何块引用块。