Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在一个模式中搜索多个模式_Php_Regex - Fatal编程技术网

Php 在一个模式中搜索多个模式

Php 在一个模式中搜索多个模式,php,regex,Php,Regex,我正在使用正则表达式从网站中提取数据,但现在我发现了一个问题 这是我想要解析的原始HTML的一部分。我想在“descuentos-”之后提取文本,在“descuentos-”之后提取城市 C 我可以查找(.*)”>,但网站中还有其他与此模式匹配的。现在我有了这个模式: #<div id="cities[0-9]+_2">(<a href = "http://website.com/descuentos-(.*?)/">(.*?)</a>)*# #()*#

我正在使用正则表达式从网站中提取数据,但现在我发现了一个问题

这是我想要解析的原始HTML的一部分。我想在“descuentos-”之后提取文本,在“descuentos-”之后提取城市 C 我可以查找(.*)”>,但网站中还有其他与此模式匹配的。现在我有了这个模式:

#<div id="cities[0-9]+_2">(<a href = "http://website.com/descuentos-(.*?)/">(.*?)</a>)*#
#()*#
我想要递归的。我的意思是:对于找到的每个“(.*)/”>(.*)”,搜索其中的两个小模式


有没有办法在正则表达式中实现这一点,或者我必须通过preg_match_all重新处理它?

选项1:快速方式:是的,使用preg_match_all()


备选案文2: DOM解析器: ($str是您的文本)


你是否考虑过使用一个HTML解析器?不要用正则表达式来解析HTML。使用HTML- PARSER。对于其他更容易的块,就像我将要提取的大部分一样,我认为它是多余的。对于这个,特别是,是的,但是我更喜欢到处使用。在你得到匹配之后,你想搜索什么?“我不明白W。你要的帽子。我只需要小图案。说到正则表达式,我不能使用“a href”“表单,因为还有其他我不需要的重合的东西,这就是为什么我必须搜索父标记并执行一些递归。关于解析器,我将尝试一下。这也是定义性地使用DOM解析器的一个原因,如果所有这些标记都位于具有特定类或id的元素内,那么使用getElementById()或getElementByClassName()无法轻松地将该元素作为目标,获取它的子对象并循环遍历它们,忘记您不希望从文档中获取的html片段
#<div id="cities[0-9]+_2">(<a href = "http://website.com/descuentos-(.*?)/">(.*?)</a>)*#
preg_match_all('#<a href = "http://website.com/descuentos-(.*?)/">.*?</a>#', $str, $matches);

echo "<pre>";
print_r($matches);
echo "</pre>";
Array
(
    [0] => Array
        (
            [0] => Badajoz
            [1] => Badalona
            [2] => Barcelona
            [3] => Bilbao
            [4] => Burgos
            [5] => Cáceres
            [6] => Cádiz
            [7] => Cartagena
            [8] => Castellón
            [9] => Ceuta
            [10] => Ciudad Real
            [11] => Córdoba
            [12] => Cuenca
        )

    [1] => Array
        (
            [0] => espana
            [1] => espana
            [2] => barcelona
            [3] => bilbao
            [4] => espana
            [5] => espana
            [6] => cadiz
            [7] => espana
            [8] => espana
            [9] => espana
            [10] => espana
            [11] => cordoba
            [12] => espana
        )

    [2] => Array
        (
            [0] => Badajoz
            [1] => Badalona
            [2] => Barcelona
            [3] => Bilbao
            [4] => Burgos
            [5] => Cáceres
            [6] => Cádiz
            [7] => Cartagena
            [8] => Castellón
            [9] => Ceuta
            [10] => Ciudad Real
            [11] => Córdoba
            [12] => Cuenca
        )

)

Time elapsed: 0.000104904174805 
$dom = new DomDocument();
$dom->loadHTML($str);

$links = $dom->getElementsByTagName('a');

foreach($links as $link){
    $href = $link->getAttribute('href');

    echo $href." ### ";//prints the href
    preg_match('#descuentos-(.*)/#', $href, $match);
    echo $link->nodeValue." - ".$match[1]."<br/>";
}
http://website.com/descuentos-espana/ ### Badajoz - espana
http://website.com/descuentos-espana/ ### Badalona - espana
http://website.com/descuentos-barcelona/ ### Barcelona - barcelona
http://website.com/descuentos-bilbao/ ### Bilbao - bilbao
http://website.com/descuentos-espana/ ### Burgos - espana
http://website.com/descuentos-espana/ ### Cáceres - espana
http://website.com/descuentos-cadiz/ ### Cádiz - cadiz
http://website.com/descuentos-espana/ ### Cartagena - espana
http://website.com/descuentos-espana/ ### Castellón - espana
http://website.com/descuentos-espana/ ### Ceuta - espana
http://website.com/descuentos-espana/ ### Ciudad Real - espana
http://website.com/descuentos-cordoba/ ### Córdoba - cordoba
http://website.com/descuentos-espana/ ### Cuenca - espana
Time elapsed: 0.000319004058838