正则表达式从有序列表中拉出匹配

时间:2013-06-22 00:15:13

标签: php regex html-parsing

给出这一串文字:

$myString = '<details class="myEl" open="open">
        <summary>In this article</summary>
        <ol>
                <li><a href="post-slug/">Introduction</a></li>
                <li><a href="post-slug/2/">Title for the second page</a></li>
                <li><a href="post-slug/3/">Title for the third page</a></li>
        </ol>
</details>';

如果我认为搜索的匹配是“/ 2 /”,那么正则表达式会为“第二页的标题”拉什么?

如果匹配为“/ 3 /”,我还需要拉“第三页的标题”,所以我需要一个通用的正则表达式来拉取&gt;之间的字符串。和&lt;比赛结束后。

2 个答案:

答案 0 :(得分:2)

试试这个:

preg_match('!\/' . $pageNo . '\/">(.*?)\<\/a\>!', $myString, $matches);
$pageTitle = $matches[1];

编辑: 第1页应该使用这个:

preg_match('!\/' . ($pageNo == 1 ? ($pageNo . '\/') : '') . '">(.*?)\<\/a\>!', $myString, $matches);
$pageTitle = $matches[1];

答案 1 :(得分:0)

我认为使用XPath制作这样的东西会更好,例如:

$str = '<details class="myEl" open="open">
        <summary>In this article</summary>
        <ol>
                <li><a href="post-slug/">Introduction</a></li>
                <li><a href="post-slug/2/">Title for the second page</a></li>
                <li><a href="post-slug/3/">Title for the third page</a></li>
        </ol>
</details>';

$xml = simplexml_load_string($str);
var_dump($xml->xpath('//details/ol/li/a[contains(@href, "/3/")]'));

但是关于正则表达式,以下正则表达式可以完成这项工作:

preg_match_all('@<li><a href="post-slug/3/">((?:(?!<\/a>).)+)</a></li>@', $str, $matches);
print_r($matches);