从 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>';

应该返回

$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="\1">', $content)

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



慕的地8271018
浏览 136回答 2
2回答

侃侃尔雅

您可以尝试:(<a&nbsp;href=".*?)"(.*?)"(.*)上述正则表达式的解释:(<a href=".*?)- 代表第一个捕获组捕获捕获第一个之前的所有内容"。请注意,我使用了惰性匹配,这有助于完成此任务。"-"从字面上匹配。(.*?)- 表示第二个捕获组捕获xyz&123介于两者之间的数据"。(.*)- 代表第三个捕获组,捕获 后的所有内容"。$1\'$2\'$3- 对于更换零件;将捕获的组与单引号一起使用。您可以在此处找到上述正则表达式的演示。示例实现 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 = '$1\'$2\'$3';$result = preg_replace($re, $subst, $str);echo $result;您可以在此处找到上述代码的示例运行。

jeck猫

我尝试过preg_replace('/<a\s+[^>]*href\s*=\s*"([^"]+)"[^>]*>/', '<a href="\1">', $content)正则表达式。但这会删除锚标记中除 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&nbsp;=&nbsp;preg_replace_callback('#href="(\S+)"#',&nbsp;function($m)&nbsp;{ &nbsp;&nbsp;return&nbsp;'href="'.str_replace('"',&nbsp;'',&nbsp;$m[1]).'"'; },&nbsp;$content);
打开App,查看更多内容
随时随地看视频慕课网APP