Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php REGEX:获取不在块引号内的字符串中的所有单词_Php_Regex - Fatal编程技术网

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 )