使用preg_match捕获标记之间的文本,PHP除外

使用preg_match捕获标记之间的文本,PHP除外,php,html,preg-match,preg-match-all,Php,Html,Preg Match,Preg Match All,从文件中获取内容我获取url的HTML代码 $html = file_get_contents($url); 现在我想捕获Ville:和之间的城市名称 HTML代码是: <span class="place ville">Ville : <span>City name</span></span> Ville:城市名称 所以我用这个: preg_match('/<span class=\"place ville\">Ville :

文件中获取内容
我获取url的HTML代码

$html = file_get_contents($url);
现在我想捕获
Ville:
之间的城市名称

HTML代码是:

<span class="place ville">Ville : <span>City name</span></span>
Ville:城市名称
所以我用这个:

preg_match('/<span class=\"place ville\">Ville : <span>(.+?)<\/span>/is', $html, $city);
$arr['city'] = $city[1];
preg_match('/Ville:(.+?)/is',$html,$city);
$arr['city']=$city[1];
它起作用了


但有时,代码如下所示,带有链接:

<span class="place ville">Ville : <span><a href="https://example.com">City name</a></span></span>
Ville:
在本例中,上述代码不起作用

你知道为什么吗


谢谢。

这有点复杂,我们只需定义两个表达式,并使用逻辑OR将它们连接起来。

<span class="place ville">Ville : <span><.+?>(.+?)<\/

在这种情况下,另一个选项可以是使用,例如使用。然后从每一个获得或:


请参见a

您应该包括当其“正常”和“不正常”时得到的结果。我想说清楚。你好,艾玛,非常感谢你的帮助。事实上,我的网页上所有的HTML代码,我有太多的匹配。有什么方法可以更具体地集成
Ville:
?提前非常感谢。Emma,你知道为什么我现在在PHP中出现这个错误吗?谢谢。你好,艾玛,第二个在城市没有
的情况下运行良好。但是如果它有
,则不起作用。你知道为什么吗?非常感谢Emma。你今晚很有用。谢谢。
<span class="place ville">Ville : <span>([^<]+)?<
<span class="place ville">Ville : <span><.+?>(.+?)<\/|<span class="place ville">Ville : <span>([^<]+)?<
$re = '/<span class="place ville">Ville : <span><.+?>(.+?)<\/|<span class="place ville">Ville : <span>([^<]+)?</m';
$str = '<span class="place ville">Ville : <span>City name</span></span>
    <span class="place ville">Ville : <span><a href="https://example.com">City name</a></span></span>
    <span class="place ville">Ville : <span>Århus</span></span>
    <span class="place ville">Ville : <span><a href="https://example.com">City name</a></span></span>
    ';

preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);

foreach ($matches as $key => $city) {
    if ($city[1] == "") {
        echo $city[2] . "\n";
    } else {
        echo $city[1] . "\n";
    }
}
City name
City name
Århus
City name
$html = <<<HTML
<span class="place ville">Ville : <span>City name 1</span></span>
<span class="place ville">Ville : <span><a href="https://example.com">City name 2</a></span></span>
HTML;


$dom = new DOMDocument();
$dom->loadHTML($html);

$xpath = new DOMXpath($dom);
$nodeList = $xpath->query("//span[contains(@class, 'place') and contains(@class, 'ville')]/span");

foreach ($nodeList as $n) {
    echo $n->textContent . PHP_EOL;
}
City name 1
City name 2