【问题标题】:Alternative to xpath with regex使用正则表达式替代 xpath
【发布时间】:2022-01-11 09:48:43
【问题描述】:

我有一些带有不同电话号码的 html 页面。 示例:

<p style="text-align: center;">(xxx) xxxx xxxx</p>
<span style="text-align: center;">xxxxxxxxxx</span>
<li style="text-align: center;">(xxx) x xxx xxxx</li>
<p style="text-align: left;">xxxxx xxxx</p>

我想知道使用 php 更改甚至删除它们的最佳方法。

我的主要想法是使用带有正则表达式的 xpath 来查找文本,但我相信正则表达式不适用于 xpath。

【问题讨论】:

  • 用 HTML 做一些事情,最好使用 xpath 而不是正则表达式。只需使用 Chrome Inspect 工具复制您要添加或删除的 HTML 元素的 xpath 位置

标签: php regex parsing


【解决方案1】:

我对 XPATH 不熟悉,但我发现一篇不错的文章可以帮助您 Use PHP Functions in XPath Expressions

你需要为她创建一个函数:preg_match_allpreg_matchpreg_replace

在编写包含 html 代码的变量后:

$YourHtmlCode = <<<HTML
'<p style="text-align: center;">(xxx) xxxx xxxx</p>
    <span style="text-align: center;">xxxxxxxxxx</span>
    <li style="text-align: center;">(xxx) x xxx xxxx</li>
    <p style="text-align: left;">xxxxx xxxx</p>';
HTML;

将您的 html 文本转换为 DOM 文档,例如:

$dom = new DOMDocument;
$dom->loadHTML($YourHtmlCode, LIBXML_HTML_NOIMPLIED|LIBXML_HTML_NODEFDTD);

使用 registerPHPFunctions 调用上述函数后。


我使用 (?)(.*?)(?= 来匹配 > 之间的所有元素操作员。 Example

你可以这样做来获得所有零件。

<?php
 
$reg = '/(?<=\>)(.*?)(?=\<)/m';
$str = '<p style="text-align: center;">(xxx) xxxx xxxx</p>
<span style="text-align: center;">xxxxxxxxxx</span>
<li style="text-align: center;">(xxx) x xxx xxxx</li>
<p style="text-align: left;">xxxxx xxxx</p>';

preg_match_all($reg, $str, $matches, PREG_SET_ORDER);

foreach ($matches as $val) {
    echo "matched: " . $val[0] . "\n";
}

?>

你可以直接在值中进行修改。

如果你想直接用正则替换值,你可以使用preg_replace

例如:

<?php
$reg = '/(?<=\>)(.*?)(?=\<)/m';
$str = '<p style="text-align: center;">(xxx) xxxx xxxx</p>
<span style="text-align: center;">xxxxxxxxxx</span>
<li style="text-align: center;">(xxx) x xxx xxxx</li>
<p style="text-align: left;">xxxxx xxxx</p>';

echo preg_replace($reg, "ReplaceString", $str); 
?>

【讨论】:

    【解决方案2】:

    一个使用正则表达式的例子。周围的标签也被删除了。

    ((\+|\d|\(|(<.*?>))[\d\-\(\)\. ]{9,}(\.|\n| |<\/.*>)(?!(png|jpg|<)))
    

    example

    【讨论】:

    • 请阅读How to Answer。不要添加纯代码答案,因为它们可能难以理解。相反,edit 的答案是解释为什么此代码解决了手头的问题,无论是在文本周围,还是在代码中的 cmets。
    猜你喜欢
    • 2014-03-29
    • 2011-05-02
    • 2020-11-21
    • 1970-01-01
    • 2012-04-20
    • 1970-01-01
    • 2010-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多