【问题标题】:Regex match img tag with certain attribute class正则表达式将 img 标记与某些属性类匹配
【发布时间】:2011-10-02 20:07:33
【问题描述】:

我一直在为这个正则表达式苦苦挣扎,但我找不到任何解决方法。我使用基于 javascript 的工具来测试和编写表达式。放入php页面与preg匹配,结果不一样。

/(<img\b src=)"([^"]+)"(.* class=".*colorme(?:.|[^"]*)"[^>]+>)/

而且要测试的例子都在这里,第一个不应该匹配。这一切都适用于 javascript,但不适用于 php,只有类 class="colorme" 将被匹配。我错过了什么吗?

<img src="http://test.jpg" class="then" border="0" width="123" height="83">

<img src="test.jpg" border="0" alt="well watch picture" alt="tersts" class="really colorme" width="228" height="138">

<img src="test.jpeg" class="colorme then" border="0" width="123" height="83">

<img src="test" border="0" width="123" height="83" class="pic colorme then" with="me">

<img src="tests" border="0" class="colorme" width="123" height="83">

【问题讨论】:

  • 使用正则表达式查找 HTML 元素(这种复杂性):坏主意。使用 HTML 解析器和 XPath!即使在 JavaScript 中,您也可以利用 DOM。
  • JavaScript 和 PHP 有不同的正则表达式变体。 (有 很多 种不同的正则表达式变体。)因此,它在 JavaScript 中工作,在 PHP 中不工作也就不足为奇了——语法(略有)不同。另外,由于 HTML 不是常规语言,因此您不能单独使用正则表达式来可靠地处理它。您可以接近,也许您可​​以使您正在尝试做的事情足够好地用于特定于您正在解决的问题的有限用例,但要小心。
  • 我可以推荐正则表达式好友:regexbuddy.com - 它可以帮助您识别和测试正确的表达式以及何时准备就绪 - 您可以看到适合您所选语言的正确表达式。

标签: php javascript regex


【解决方案1】:

使用 DOM,没有花哨的表达方式...

<?php 
$doc =<<<DEMO
<img src="http://test.jpg" class="then" border="0" width="123" height="83">
<img src="test.jpg" border="0" alt="well watch picture" alt="tersts" class="really colorme" width="228" height="138">
<img src="test.jpeg" class="colorme then" border="0" width="123" height="83">
<img src="test" border="0" width="123" height="83" class="pic colorme then" with="me">
<img src="tests" border="0" class="colorme" width="123" height="83">
DEMO;

$xml = new DOMDocument();
//Or you could use for locally saved files
//@$xml->loadHTMLFile('savedfile.html');
@$xml->loadHTML($doc);
foreach($xml->getElementsByTagName('img') as $image) {
    if(strstr($image->getAttribute('class'),'colorme')==true){
        $images[] = $image->getAttribute('src');
    }
}
print_r($images);
?>

输出:

Array (
    [0] => test.jpg
    [1] => test.jpeg
    [2] => test
    [3] => tests )

【讨论】:

    【解决方案2】:

    一般来说,没有两种正则表达式语言是相同的,而且 Javascript 和 PHP 处理它们的方式存在巨大差异,因此您无法真正将一种语言复制并粘贴到另一种语言中。老实说,我认为将 DOM Document 对象与 XPath 之类的东西一起使用会容易得多,但就您的目的而言,正则表达式绝对没问题。如果你试图只匹配一个标签左右,你总是可以制作一个有效的正则表达式,只有当你开始尝试做更多的事情时,你才会开始看到正则表达式在该领域的缺点,大多数人似乎忘记了这一点。

    因此,总而言之,您应该使用 HTML 解析器,但您可以使用正则表达式。两种方式都没有法律。我建议您为此使用 DOM 和 XPath,但如果您想将其作为正则表达式,请查看此页面上的第二个答案(得分为 300+)

    Regular expression pattern not matching anywhere in string

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-01
      • 2015-08-05
      • 2011-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多