php - REGEX:获取字符串中不在 block 引号内的所有单词

标签 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 字符串。但我只想要不在 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 ) 

说明

  1. | 交替的左侧,我们匹配整个 block 引用,我们知道我们不想要它。当 Tom 在 block 引用内匹配时,(?!) 强制正则表达式失败并回溯。引擎回溯到(*SKIP),这告诉它放弃到目前为止的整个匹配,并在字符串中的下一个位置尝试新的匹配。
  2. 在交替的右侧,我们现在可以安全地匹配 Tom。

感谢 Hamza 指出,我们可以跳过任何 blockquote block ,而不是跳过包含“Tom”的 blockquote block 。

关于php - REGEX:获取字符串中不在 block 引号内的所有单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23350655/

相关文章:

javascript - 正则表达式匹配所有单数或双数数字

php - 使用链接从数据库中删除值

php - 如何解决相似页面的重复页面内容问题

python - 如何从pandas数据框中的列值中删除连续的四位数字

c++ - 什么是可移植的轻量级 C/C++ 正则表达式库?

python - 从 Python 代码字符串(正则表达式或 AST)中提取所有变量

regex - 如何使用 Notepad++ 将文本向右对齐?

php - Laravel 5 命令 - 强制选项

php - 将服务器字符集从 iso-8859-1 更改为 utf-8

php - SQL语法接近,没有正确使用