请看一下这个:
$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
字符串。但我只想要不在 block 引用标签内的 Tom
字符串。在这种情况下,只应返回一个 Tom
字符串。如何做到这一点?
最佳答案
这个正则表达式应该适合你:
<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 )
说明
- 在
|
交替的左侧,我们匹配整个 block 引用,我们知道我们不想要它。当 Tom 在 block 引用内匹配时,(?!)
强制正则表达式失败并回溯。引擎回溯到(*SKIP)
,这告诉它放弃到目前为止的整个匹配,并在字符串中的下一个位置尝试新的匹配。 - 在交替的右侧,我们现在可以安全地匹配 Tom。
感谢 Hamza 指出,我们可以跳过任何 blockquote block ,而不是跳过包含“Tom”的 blockquote block 。
关于php - REGEX:获取字符串中不在 block 引号内的所有单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23350655/