从 href 中删除双引号

Removing double quotes from href

我有一个 html 字符串,需要从锚标记的 href 中删除双引号。

$content = '<p style="abc" rel="blah blah"> Hello I am p </p> <a href="https://example.com/abc?name="xyz&123""></a>';

应该return

$content = '<p style="abc" rel="blah blah"> Hello I am p </p> <a href="https://example.com/abc?name='xyz&123'"></a>';

我试过了

preg_replace('/<a\s+[^>]*href\s*=\s*"([^"]+)"[^>]*>/', '<a href="">', $content)

但这会从锚标记中删除除 href 之外的所有属性。无法找到可以在 href 中实际工作的东西 正在寻找相同的 php 代码。

I have tried preg_replace('/<a\s+[^>]*href\s*=\s*"([^"]+)"[^>]*>/', '<a href="">', $content) regex. but this removes all attributes from anchor tag except for href.

也许更通用一些 - 并把所有 <a ...> 的东西从等式开始?

没有太多 HTML 元素以 href 属性开头 - 即使您遇到具有这样 href 值的不同元素,它也没有意义要么,所以无论如何也需要更换。

#href="(\S+)"# 作为贪婪模式寻找并捕获 href="" 之间可能最长的非空白字符串。 这给出了 href="https://example.com/abc?name="xyz&123"" 作为完全匹配,而 https://example.com/abc?name="xyz&123" 作为部分匹配。

让我们将后者输入 str_replace 以摆脱 ",使用 preg_replace:

$content = preg_replace_callback('#href="(\S+)"#', function($m) {
  return 'href="'.str_replace('"', '', $m[1]).'"';
}, $content);

你可以试试:

(<a href=".*?)"(.*?)"(.*)

上面正则表达式的解释:

  • (<a href=".*?) - 表示第一个捕获组捕获第一个 " 之前的所有内容。请注意,我使用了 lazy 匹配来简化此任务。
  • " - 按字面意思匹配 "
  • (.*?) - 表示第二个捕获组捕获数据xyz&123,它在".
  • 之间
  • (.*) - 表示第 3 个捕获组,它捕获 ".
  • 之后的所有内容
  • \'\' - 用于替换零件;使用捕获的组和单引号。

你可以在here.

中找到上述正则表达式的演示

示例实施 inf php:

<?php
$re = '/(<a href=".*?)"(.*?)"(.*)/m';
$str = '<p style="abc" rel="blah blah"> Hello I am p </p> <a href="https://example.com/abc?name="xyz&123""></a>';
$subst = '\'\'';

$result = preg_replace($re, $subst, $str);

echo $result;

您可以在here.

中找到上述代码的示例运行