多个通配符 preg_match_all php

Posted

技术标签:

【中文标题】多个通配符 preg_match_all php【英文标题】:Multiple wildcard preg_match_all php 【发布时间】:2014-06-28 19:38:06 【问题描述】:

我想从 html 中提取一个介于 <td>...</td> 之间的数字。我尝试了以下代码:

$views = "/<td id=\"adv-result-views-(?:.*)\" class=\"spec\">(.*?)<\/td>/";

-views- 之后是一个随机数。在搜索中忽略随机数的正确代码是什么?

【问题讨论】:

你能发一个你想匹配的html的例子吗? &lt;td id="adv-result-views-190147977" class="spec"&gt; 4 &lt;/td&gt; 数字 4 是我想用 preg_match_all 得到的 adv-result-views-\d+ @PedroLobito,停止宣传您的答案。 OP 将在您发布一次时收到通知。 【参考方案1】:

使用DOM 是正确的方法..

往这边走……

<?php
$htm = '<td id="adv-result-views-190147977" class="spec"> 4 </td>';
$dom = new DOMDocument;
$dom->loadHTML($htm);
echo $content = $dom->getElementsByTagName('td')->item(0)->nodeValue; //4

【讨论】:

这不是我要提取的数字,而是您示例中的“Sometext”。并且 DOM 是不可能的,因为该类在多个 中使用并且 id 是随机的。 我认为你没有完全理解这个问题。 @ShankarDamodaran 使用 DOM 的方法是正确的 【参考方案2】:
$html = '<td id="adv-result-views-190147977" class="spec"> 4 </td>';

// get the value of element
echo trim( strip_tags( $html ) );

// get the number in id attribute, replace string with group capture $1
echo preg_replace( '/^.*?id="[\pLl-]+(\d+).*$/s', '$1', $html );   
/*
    ^.*?id="            Any character from the beginning of string, not gready
        id="            Find 'id="'
            [\pLl-]+    Lower case letter and '-' ( 1 or more times )
            (\d+)       Group and capture to \1 -> digits (0-9) (1 or more times) -> end of \1                      
    .*$                 Any character, gready, until end of the string
*/

// get html withut the number in id attribute
echo preg_replace( '/(^.*?id="[\pLl-]+)(\d+)(.*$)/s', '$1$3', $html );

这是一个正则表达式示例,因为问题是这样标记的,但 DOM 是 解析 html 的首选方式(尤其是在 SO 社区中)。

【讨论】:

以上是关于多个通配符 preg_match_all php的主要内容,如果未能解决你的问题,请参考以下文章

Preg_match_all多个内容

php 'preg_match_all' 和 'str_replace':用数组键替换常量的正则表达式

php 正则获取字符串中的汉字preg_match_all

在PHP中从preg_match_all中返回的值

PHP - preg_match_all 没有搜索完整的字符串?

使用 preg_match_all PHP 限制结果数