PHP正则表达式子模式行为

时间:2010-06-15 09:37:02

标签: php regex

我想匹配图片代码的src和title属性:

图案:

<img [^>]*src=["|\']([^"|\']+["|\'])|title=["|\']([^"|\']+)

目标:

<img src="http://someurl.jpg" class="quiz_caption" title="Caption goes here!">

这种模式给了我一个不需要的匹配,title =“content”,以及我实际想要的匹配,即'title'之后的引号之间的值,即'content'。

所以,我的比赛是:

<img src="http://someurl.jpg
http://someurl.jpg
title="Caption goes here!"
Caption goes here!

有没有办法避免这些比赛中的第三场比赛?我在PHP 5.2.x中使用PCRE

2 个答案:

答案 0 :(得分:3)

除非您知道自己正在处理HTML的一个子集,否则无法使用正则表达式解析HTML。你的正则表达式,即使是正确的,也会失败,例如如果任何属性具有>字符。

使用DOM扩展名:

<?php
$target = <<<EOD
<img src="http://someurl.jpg" class="quiz_caption" title="Caption goes here!">
EOD;

$d = new DOMDocument();
$d->loadHTML($target);
$img = $d->getElementsByTagName("img");

echo $img->item(0)->getAttribute("src") . "\n";
echo $img->item(0)->getAttribute("title") . "\n";

答案 1 :(得分:1)

如果您确切知道自己在寻找什么,可以试试这个:

src="(.+?)"|title="(.+?)"

我还建议你在http://gskinner.com/RegExr/进行一些游戏,这是一个flash的在线注册表...它可以帮助你提高你的知识,并且它有许多由社区预先构建的表达。