【问题标题】:How to use RegEx to get what I want and nothing in between [duplicate]如何使用正则表达式来获得我想要的东西,而两者之间没有任何东西[重复]
【发布时间】:2013-01-21 03:46:23
【问题描述】:

我已经用 Regex 搞砸了几个小时,但我陷入了僵局。假设我有这个:

<a href="/link here/faqs"></a><a href="/link/here/contacts"></a><a href="/link here/faqs">

我想使用 PHP preg_replace 来匹配和删除 faqs 链接,所以剩下的就是中间的联系人链接。我该怎么做?我发现了如何使它匹配 &lt;a href 也匹配 /faqs"&gt;&lt;/a&gt; 但事实上 /faqs"&gt;&lt;/a&gt; 也在第三个链接中,然后它删除了第二个链接。

在第三个链接之后可能还有更多,所以我不能使用行尾或任何东西来阻止正则表达式匹配更多。

再一次,我如何让它匹配第一个和最后一个,但保持中间位置?请记住,在最后一个常见问题解答之后可能还有其他链接,并且在它们之后可能有更多常见问题解答链接。但我想删除所有常见问题解答。

附带说明一下,如果我想删除所有常见问题解答以及所有名为“帮助”的问题,它将如何工作。

【问题讨论】:

  • 请显示您要解析的文本。我们不知道您可能指的常见问题解答...
  • 现在是 2013 年。使用 XML 解析器。
  • 我赌2美分贪婪。如果您想对代码提出建议,通常您可能希望展示您的编码尝试。

标签: php regex html-parsing


【解决方案1】:

在这里使用 XML 解析器可能有点过头了:

$html = '<a href="/link here/faqs"></a><a href="/link/here/contacts"></a><a href="/link here/faqs">';
$dom = new DomDocument();
$dom->loadHtml($html);

$xpath = new DomXPath($dom);
$links = $xpath->evaluate('//a');

$newHtml = '';

// rebuild html, and leave out any links that contain "faq"
// in the href attribute
foreach($links as $link)
  if(strpos($link->getAttribute('href'), 'faq') === false)
    $newHtml .= $dom->saveXml($link);

print $newHtml;

【讨论】:

  • 我从未想过使用 XML 解析器。我还是新手。谢谢你的建议。我会尝试并告诉你
  • 更多想法请见htmlparsing.com
猜你喜欢
  • 2016-03-04
  • 2013-08-17
  • 1970-01-01
  • 2020-10-13
  • 1970-01-01
  • 1970-01-01
  • 2016-02-25
  • 2021-06-09
相关资源
最近更新 更多