【问题标题】:preg_match_all regex fails when there are spacespreg_match_all 正则表达式在有空格时失败
【发布时间】:2014-10-12 00:15:48
【问题描述】:

我正在尝试使用以下正则表达式从 html 源代码中获取图像 url,但是当图像 url 中有空格时它会失败。例如这个网址:

<img src="http://a57.foxnews.com/global.fncstatic.com/static/managed/img/Entertainment/876/493/kazantsev pink bikini reuters.jpg?ve=1&amp;tl=1" alt="kazantsev pink bikini reuters.jpg" itemprop="image">

$image_regex_src_url = '/<img[^>]*'.'src=[\"|\'](.*)[\"|\']/Ui';
preg_match_all($image_regex_src_url, $string, $out, PREG_PATTERN_ORDER);

这给了我以下信息。
http://a57.foxnews.com/global.fncstatic.com/static/managed/img/Entertainment/876/493/kazantsev

有没有办法匹配任何字符,包括空格?还是我必须在php配置中设置?

【问题讨论】:

  • .* 也包含空格。问题不在这里,正则表达式工作正常。显示您尝试将其应用到的文本。可能会发生没有空格,但是'"(它们根本不应该在url 中)
  • 您可以简化您的正则表达式:&lt;img.*?src=["|'](.*)["|'] 这个匹配您的整个 URL。您可以使用regexp simulators 来测试您的表达方式。
  • 我正在尝试在此处发布字符串以查看是否有其他原因无法正常工作,但我在使用 stackoverflow 截断它时遇到问题,是否可以在其中添加标签粘贴代码时的cmets? a57.foxnews.com/global.fncstatic.com/static/managed/img/…粉色比基尼reuters.jpg?ve=1&tl=1" alt="kazantsev 粉色比基尼reuters.jpg" itemprop="image">

标签: php regex whitespace


【解决方案1】:

您的正则表达式存在几个问题。

首先,您尝试使用连接运算符 ('.') 将表达式的两个部分连接在一起(这不是必需的)。其次,您不需要在字符类中使用交替运算符|

. 将匹配除换行符序列以外的任何字符。这些标签有可能包含换行符,因为它们位于 HTML 源代码中。您可以使用s (dotall) 修饰符强制点匹配任何字符,包括换行符或使用否定字符类,意思是匹配任何字符except

使用s (dotall) 修饰符:

$image_regex_src_url = '/<img[^>]*src=(["\'])(.*?)\1/si';

使用否定字符类[^ ]

$image_regex_src_url = '/<img[^>]*src=(["\'])([^"\']*)\1/i';

不过,使用 DOM 之类的解析器来获取结果要容易得多。

$doc = new DOMDocument;
@$doc->loadHTML($html); // load the HTML

foreach($doc->getElementsByTagName('img') as $node) {
   $urls[] = $node->getAttribute('src');
}

print_r($urls);

【讨论】:

  • 这样更好,我解决第一个问题后试试。谢谢。
  • 感谢您清理正则表达式以及更清洁且可能更快的替代方法。非常感谢您提供易于理解的解释。仅供将来参考如何合并您提到的 s(dotall)修饰符。
  • 再次感谢。我将使用您建议的 dom 解决方案重新编写代码。
  • 刚刚实现了,好像快多了。
猜你喜欢
  • 1970-01-01
  • 2011-03-11
  • 1970-01-01
  • 2015-08-24
  • 2013-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多