【问题标题】:Remove anchor tag and get inner text in an array form using regular expression使用正则表达式删除锚标记并以数组形式获取内部文本
【发布时间】:2015-11-09 21:46:37
【问题描述】:

我正在使用此代码删除锚标记,并使用表达式仅获取内部文本

    <ul class="alpha">
                <li><h3><a href="http://www.overstock.com/Electronics/Computers-Tablets/473/dept.html?TID=TN:ELEC:Comp">Computers &amp; Tablets</a></h3></li>
                <li><a href="http://www.overstock.com/Electronics/2-in-1s/28195/subcat.html?TID=TN:ELEC:2in1">2-in-1s</a></li>
                <li><a href="http://www.overstock.com/Electronics/Laptops/133/subcat.html?TID=TN:ELEC:Lap">Laptops</a></li>
</ul>

表达式为:

echo preg_replace('#<a.*?>([^>]*)</a>#i', '$1', $str);

输出是:

Computers & Tablets
2-in-1s
Laptops

我们可以使用正则表达式以数组形式获取锚标记内的内部文本吗?请分享您的想法。

【问题讨论】:

  • 那是 PHP 吗?您可以使用DOMDocument 轻松做到这一点。
  • 而不是preg_replace 使用preg_match_all
  • 作为一般规则:使用 DOM 解析,而不是正则表达式来解析 HTML。
  • 不要使用正则表达式来处理 HTML。请参考this 问题,了解如何通过 DOM 操作来完成。

标签: javascript php jquery html regex


【解决方案1】:

好吧,我不希望您将 HTML 与 regex 一起使用,而是使用 DomDocument,但好像您想使用 regex 而不是可以使用 preg_match_all as

preg_match_all('/(?:(<a.*?>))(.*?)(?=<\/a>)/', '<ul class="alpha">
                <li><h3><a href="http://www.overstock.com/Electronics/Computers-Tablets/473/dept.html?TID=TN:ELEC:Comp">Computers &amp; Tablets</a></h3></li>
                <li><a href="http://www.overstock.com/Electronics/2-in-1s/28195/subcat.html?TID=TN:ELEC:2in1">2-in-1s</a></li>
                <li><a href="http://www.overstock.com/Electronics/Laptops/133/subcat.html?TID=TN:ELEC:Lap">Laptops</a></li>
</ul>',$res);
print_r($res[0]);

输出:

Array
(
    [0] => Computers & Tablets
    [1] => 2-in-1s
    [2] => Laptops
)

【讨论】:

  • 解析包含.*? 的HTML 字符串的基于正则表达式的解决方案远非完美。我相信您迟早会回到这里,寻求可靠、正确的解决方案。仅举几个例子:Bad 1Bad 2。一旦输入字符串足够大,灾难性的回溯就迫在眉睫。
  • 是的,你是对的@stribizhev,即使这就是为什么我说将正则表达式与 HTML 一起工作并不是一个好主意,它不是处理 HTML 解析的正确方法
【解决方案2】:

由于您使用了 jQuery 标记,我更喜欢在 jQuery 中执行此操作:

var values = [];
$('.alpha').find('a').each(function(index){
    values.push($(this).text());
});

此代码获取 .alpha 类中的所有链接并将它们推送到 values 数组中。 values 的输出为:

0: "Computers & Tablets"
1: "2-in-1s"
2: "Laptops"

【讨论】:

    猜你喜欢
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多