【问题标题】:PHP regex pattern not identifying closing bracket for tagPHP正则表达式模式没有识别标签的右括号
【发布时间】:2015-06-12 20:51:40
【问题描述】:

我有一个文本区域,其中可能包含标签。我需要在 src 属性(“/storyimages/”)中使用特定的文本字符串来识别这些标签并删除它们。例如,如果我有文本

<br><img src="/storyimages/myimage.jpg" align="right" WIDTH="105" HEIGHT="131"><b>(CNS) </b>Lorem ipsum dolor...

我只想摆脱整个标签并用''替换它。我尝试使用的正则表达式模式是

/<img src=.*\/storyimages\/.*>/

但它不起作用。发生的情况是它标识了字符串 ok 的开始,但它没有标识结束符 > 字符,所以如果我使用 preg_match(),匹配以 .

我知道您不应该在 HTML 上使用正则表达式,但这不是嵌入式标签;它只是一堆文本中的一个标签,所以我应该没问题。据我所知, > 不是特殊字符,但即使我将其转义,我仍然得到相同的结果。

我是否缺少一些简单的东西可以使这项工作正常进行?或者我是否需要编写某种函数,逐个字符地遍历字符串以查找开括号和右括号的位置,然后替换它们?

有趣的是,当我用regex tester 尝试这个时,它工作正常,但是当我实际运行代码时,我遇到了上述问题。

谢谢。

【问题讨论】:

  • 这是不使用正则表达式的一种方法:eval.in/309744
  • 如果您的问题是您没有匹配 img 之后的第一个 &gt;,您需要使用 ? 使其变得懒惰,正则表达式将是 &lt;img src=.*\/storyimages\/.*?&gt; ,经过测试 @987654323 @

标签: php html regex


【解决方案1】:

使用&lt;img src=.*?\/storyimages\/.*?&gt; 正则表达式。

重点是使用*? 限定符使匹配不贪心(即匹配尽可能少的匹配字符)。

这是一个示例 PHP 代码:

$re = "/<img src=.*?\\/storyimages\\/.*?>/"; 
$str = "<br><img src=\"/storyimages/myimage.jpg\" align=\"right\" WIDTH=\"105\" HEIGHT=\"131\"><b>(CNS) </b>Lorem ipsum dolor..."; 
preg_match($re, $str, $matches);

匹配看起来像&lt;img src="/storyimages/myimage.jpg" align="right" WIDTH="105" HEIGHT="131"&gt;

【讨论】:

  • 跟进问题:如上所述,这完美地隔离了标签。但是,我无法在我的文本中替换字符串,要么使用带有模式的 preg_replace(),要么使用带有匹配数组中返回值的 str_replace()。如果我在 str_replace() 中使用 count 选项,它会返回 1,但没有任何内容被替换。此外,您的代码示例在 /storyimages/ 的两侧都有两个反斜杠。这只是一个错字吗?
  • 请查看这个示例程序:tutorialspoint.com/…。它表明我可以使用preg_replace。不知道你的意思是什么错字,我只是使用/storyimages/ 将正则表达式定位到具有此字符串的任何标签。
  • 我(错误地)指的是在您的代码示例中转义反斜杠的错字(它们在您的答案的第一个代码示例中不存在)。我遇到的问题是我的模式与 preg_match_all() 在查找标签并将它们放在匹配数组中时效果很好,但是当我实际替换它们时,相同的模式不起作用。我怀疑这与需要转义字符串中的双引号有关。我尝试在我的文本字符串上使用addslashes()(它比我的示例中长得多),但它仍然没有被替换。还在努力……
  • 检查替换字符串中的特定字符。如果有$,应该加倍。
  • 叹息。我发现了这个问题,它与正则表达式本身无关。非常感谢您的帮助和快速回复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-19
  • 2019-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多