如果包含指定文本,则将 HTML 超链接更改为纯文本

发布于 2024-08-11 00:00:22 字数 700 浏览 9 评论 0 原文

我有一个包含一些链接的变量。现在我想从已单击的链接中删除 标记,以通知最终用户当前页面。

输入字符串和我的代码:

$links = '<a href="#" onclick="sort_data(\'All\',\'all\')">All</a> | <a href="#" onclick="sort_data(\'Diversified\',\'1\')">Equity</a> | <a href="#" onclick="sort_data(\'Liquid\',\'1\')">Liquid</a> | <a href="#" onclick="sort_data(\'Sector\',\'1\')">Sector</a>';
if (preg_match('/<A HREF="#" onclick="(.*?)>Equity/', $links))
{
    echo preg_replace('/<A HREF=(.*?)>Equity/', 'Equity', $links);
}

这将替换 Equity 之前编写的所有内容,而我希望只删除 Equity 的锚标记,并且内部文本应保持原样。

我在这里做错了什么?有更好的方法来做到这一点吗?

I have a variable that contains some links. Now I want to strip the <a> tags from the link which has been clicked to inform the end user of the current page.

Input string and my code:

$links = '<a href="#" onclick="sort_data(\'All\',\'all\')">All</a> | <a href="#" onclick="sort_data(\'Diversified\',\'1\')">Equity</a> | <a href="#" onclick="sort_data(\'Liquid\',\'1\')">Liquid</a> | <a href="#" onclick="sort_data(\'Sector\',\'1\')">Sector</a>';
if (preg_match('/<A HREF="#" onclick="(.*?)>Equity/', $links))
{
    echo preg_replace('/<A HREF=(.*?)>Equity/', 'Equity', $links);
}

This is replacing everything written before Equity while I want that only Equity's anchor tag should be removed and the inner text should remain as it is.

What am I doing wrong here? Is there some better way to do this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

半衬遮猫 2024-08-18 00:00:22

默认情况下,替换是“贪婪的”,并且匹配第一个“

尝试 /]*?)>Equity/

[^<>] 应将您的选择限制为字符不是尖括号,因此将其限制为单个 href 标记。

Replace is by default "greedy" and is matching the first "<A HREF..." all the way through to your last "Equity".

Try /<A HREF=([^<>]*?)>Equity/

The [^<>] should restrict your selection to character that are NOT angle brackets and so restrict it to a single href tag.

绮烟 2024-08-18 00:00:22

您应该在不区分大小写标志 href="http://fr.php.net/preg_match" rel="nofollow noreferrer">preg_match 和 preg_replace
另外 preg_match 只会匹配一个链接,如果您需要替换所有链接 preg_match_all 会更好。

$links='<a href="#" onclick="sort_data(\'All\',\'all\')">All</a> | <a href="#" onclick="sort_data(\'Diversified\',\'1\')">Equity</a> | <a href="#" onclick="sort_data(\'Liquid\',\'1\')">Liquid</a> | <a href="#" onclick="sort_data(\'Sector\',\'1\')">Sector</a>
';
if(preg_match('/<A HREF="#" onclick="(.*?)>Equity/i',$links))
{
    echo preg_replace('/<A HREF=([^>]*)>Equity/i','<A $1>Equity',$links);
}

注意:我不知道为什么你要在服务器端这样做,但最好使用 javascript 框架在客户端执行此操作,jquery 非常适合执行此类操作。另外,你最好制作非侵入式javascript,这样确实更便于维护,

you should use the case insensitive flag on preg_match and preg_replace.
Also preg_match would match only one link, if you need to replace all link preg_match_all would be better.

$links='<a href="#" onclick="sort_data(\'All\',\'all\')">All</a> | <a href="#" onclick="sort_data(\'Diversified\',\'1\')">Equity</a> | <a href="#" onclick="sort_data(\'Liquid\',\'1\')">Liquid</a> | <a href="#" onclick="sort_data(\'Sector\',\'1\')">Sector</a>
';
if(preg_match('/<A HREF="#" onclick="(.*?)>Equity/i',$links))
{
    echo preg_replace('/<A HREF=([^>]*)>Equity/i','<A $1>Equity',$links);
}

Note: I don't know why you are doing that on server side but might be better to do it on client side with a javascript framework, jquery would be perfect to do such manipulations. Also you have better to make non intrusive javascript that really better for maintenance,

情域 2024-08-18 00:00:22

如果您只想摆脱 标记,为什么不使用 strip_tags 函数?

If all you want to do is get rid of the <A HREF=...> and </A> tags, why not use the strip_tags function?

葬心 2024-08-18 00:00:22

您的代码中存在多个缺陷:

  1. 尽管您使用了小写字母,但您仍在搜索大写字母。要解决此问题,请使用 i (不区分大小写)选项或更改 reg exp。
  2. 您忘记了结束标记
  3. 贪婪的 * 将消耗搜索到的链接前面的每个链接。
  4. (如果您只想继续使用被操作的字符串,则 if 分支可能是不必要的。)

尝试以下操作:

$links='<a href="#" onclick="sort_data('All','all')">All</a> | <a href="#" onclick="sort_data('Diversified','1')">Equity</a> | <a href="#" onclick="sort_data('Liquid','1')">Liquid</a> | <a href="#" onclick="sort_data('Sector','1')">Sector</a>';
if(preg_match('/<A([^<>]*)>Equity</A>/i',$links)) {
    echo preg_replace('/<A([^<>]*)>Equity</A>/i','Equity',$links);
}

You have multiple flaws in your code:

  1. Your searching for upper case letters, although you used lower case letters. To fix this use the i (case insensitive) option or change the reg exp.
  2. You forgot the closing tag </a>.
  3. The greedy * will consume every link in front of the searched one.
  4. (The if branch is possibly unnecessary, if you ony want to continue to use the manipulated string.)

Try this:

$links='<a href="#" onclick="sort_data('All','all')">All</a> | <a href="#" onclick="sort_data('Diversified','1')">Equity</a> | <a href="#" onclick="sort_data('Liquid','1')">Liquid</a> | <a href="#" onclick="sort_data('Sector','1')">Sector</a>';
if(preg_match('/<A([^<>]*)>Equity</A>/i',$links)) {
    echo preg_replace('/<A([^<>]*)>Equity</A>/i','Equity',$links);
}
情仇皆在手 2024-08-18 00:00:22

假设您的字符串是较大 HTML 字符串的一部分,您可以使用合法的 DOM 解析器来隔离超链接并将其替换为相应的文本。

代码:(演示)

$links = <<<HTML
<div>
<a href="#" onclick="sort_data('All','all')">All</a> | <a href="#" onclick="sort_data('Diversified','1')">Equity</a> | <a href="#" onclick="sort_data('Liquid','1')">Liquid</a> | <a href="#" onclick="sort_data('Sector','1')">Sector</a>
</div>
HTML;

$target = 'Equity';

$doc = new DOMDocument();
$doc->loadHTML($links, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xpath = new DOMXPath($doc);
$a = $xpath->query("//a[text()='$target']")->item(0);
$a->parentNode->replaceChild($doc->createTextNode($target), $a);
echo $doc->saveHTML();

原始输出:

<div>
<a href="#" onclick="sort_data('All','all')">All</a> | Equity | <a href="#" onclick="sort_data('Liquid','1')">Liquid</a> | <a href="#" onclick="sort_data('Sector','1')">Sector</a>
</div>

渲染输出:

Assuming your string is part of a larger HTML string, you can use a legitimate DOM parser to isolate and replace the hyperlink with the corresponding text.

CODE: (Demo)

$links = <<<HTML
<div>
<a href="#" onclick="sort_data('All','all')">All</a> | <a href="#" onclick="sort_data('Diversified','1')">Equity</a> | <a href="#" onclick="sort_data('Liquid','1')">Liquid</a> | <a href="#" onclick="sort_data('Sector','1')">Sector</a>
</div>
HTML;

$target = 'Equity';

$doc = new DOMDocument();
$doc->loadHTML($links, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xpath = new DOMXPath($doc);
$a = $xpath->query("//a[text()='$target']")->item(0);
$a->parentNode->replaceChild($doc->createTextNode($target), $a);
echo $doc->saveHTML();

Raw output:

<div>
<a href="#" onclick="sort_data('All','all')">All</a> | Equity | <a href="#" onclick="sort_data('Liquid','1')">Liquid</a> | <a href="#" onclick="sort_data('Sector','1')">Sector</a>
</div>

Rendered output:

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文