Php REGEX:获取不在块引号内的字符串中的所有单词
请看一下:Php REGEX:获取不在块引号内的字符串中的所有单词,php,regex,Php,Regex,请看一下: $content='你好,我是汤姆,我是报价单中的另一个汤姆'; $pattern='Tom'; $matches=array(); preg_match_all($pattern、$content、$matches); var_dump($matches); 这将返回两个Tom字符串。但是我只想要不在块引号标记内的Tom字符串。在这种情况下,只应返回一个Tom字符串。如何做到这一点?此正则表达式适用于您: <blockquote[^>]*>[^<]*&l
$content='你好,我是汤姆,我是报价单中的另一个汤姆';
$pattern='Tom';
$matches=array();
preg_match_all($pattern、$content、$matches);
var_dump($matches);
这将返回两个
Tom
字符串。但是我只想要不在块引号标记内的Tom
字符串。在这种情况下,只应返回一个Tom
字符串。如何做到这一点?此正则表达式适用于您:
<blockquote[^>]*>[^<]*</blockquote>(*SKIP)(?!)|Tom
解释
|
备选方案的左侧,我们匹配了一个完整的blockquote,我们知道我们不想要它。(?!)
强制regex在blockquote中匹配Tom时失败并回溯。引擎返回到(*跳过)
,这告诉它放弃目前为止的整个匹配,并在字符串的下一个位置尝试新的匹配感谢Hamza指出,与其跳过包含“Tom”的blockquotes块,我们可以跳过任何blockquote块。Simple。不要使用正则表达式。将代码段加载到DOM解析器中,删除所有blockquotes元素及其子元素,然后导出剩余文本。@TK123修复了拼写错误,添加了解释。让我知道这是否有效,或者您是否有疑问。:)@TK123 Argh另一个输入错误。已修复。您可以通过匹配/跳过所有块引号来简化正则表达式。(*跳过)(?!)| Tom@tk123这解决了您的问题,还是您仍在努力解决?让我知道。:)
<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 )