1

鉴于此文本字符串:

$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/”,我还需要拉出“第三页的标题”,所以我需要一个通用的正则表达式,它将在匹配后拉出 > 和 < 之间的字符串。

4

2 回答 2

2

试试这个:

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

编辑:第 1 页应该与此一起使用:

preg_match('!\/' . ($pageNo == 1 ? ($pageNo . '\/') : '') . '">(.*?)\<\/a\>!', $myString, $matches);
$pageTitle = $matches[1];
于 2013-06-22T00:33:03.923 回答
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);
于 2013-06-22T00:31:54.140 回答