PHP:从链接标题中删除“http://”

8
我有一个字符串,它看起来像这样: $string = '<a href="http://google.com">http://google.com</a>';
我该如何从链接文本中删除http://部分,但在href属性中保留它?

你可能会发现s($str)->replaceLast('http://')很有帮助,这是在这个独立库中找到的。 - caw
7个回答

11

如果不使用完整的解析器,这个方法对大多数情况可能是可行的...

$str = '<a href="http://google.com">http://google.com</a>';

$regex = '/(?<!href=["\'])http:\/\//';

$str = preg_replace($regex, '', $str);

var_dump($str); // string(42) "<a href="http://google.com">google.com</a>"
它使用负向后顾断言来确保其前面没有href="href='在IDEone上查看。 它还考虑到将属性值用'分隔的人。

可以运行,谢谢。这个 ideone 网站很不错,你实际上可以在上面运行 PHP 代码 :) - Alex

9
$string = '<a href="http://google.com">http://google.com</a>'; 
$var = str_replace('>http://','>',$string); 

我在IDEone.com上尝试了一下,它产生了期望的效果。


2
只是值得一提的是,这不会捕获 > http://...,但如果您事先修剪空格,那么这应该可以做到。 - Robert
不要忘记在 <a> 标签之间加上空格,例如 <a href='...'> Text </a> - Robert
@Robert 或者如果你缩进你的文本节点(我经常这样做是为了可读性),也可以换行。 - alex

4

在这种简单情况下,preg_replace 函数可能会起作用。为了更加稳定,请尝试使用 DOMDocument

$string = '<a href="http://google.com">http://google.com</a>';
$dom = new DOMDocument;
$dom->loadXML($string);

$link = $dom->firstChild;
$link->nodeValue = str_replace('http://', '', $link->nodeValue);
$string = $dom->saveXML($link);

只是一个边缘情况,你可能想使用正则表达式来确保你只从开头剥离它,那么像 http://example.com/send-to-friend?url=http://somewhere.com 这样的链接怎么办?此外,使用解析器加1。 - alex

4
$str = 'http://www.google.com';
$str = preg_replace('#^https?://#', '', $str);
echo $str; // www.google.com

可以同时支持 http:// 和 https:// 的解决方案

运行实时代码


2

任何简单的正则表达式或字符串替换代码在一般情况下都可能失败。唯一“正确”的方法是将该块解析为 SGML/XML 片段并从值中删除 http://

对于任何其他(相当短的)字符串操作代码,找到打破它的反例将非常容易。


嗯,错误的方法仍然更合适。这里没有足够的边缘情况潜力来使用过度解决方案(HTML解析器)。正则表达式就足够了。(不使用正则表达式进行HTML解析的梗有点过时了。) - mario
1
一个人的“梗”可能是另一个人的正确性。我们不知道这个工作的重要程度,或者输入有多可靠。正则表达式可能有效,但我不想给@Alexandra留下印象,让他们认为这个问题已经解决了所有可能的输入。 - Justin Morgan

2
假设 $string 中始终出现两次 "http://",使用 strripos 反向搜索字符串中的 "http://"。如果搜索成功,您将知道要删除的 "http://" 的 start_index(当然您也知道长度)。现在,您可以使用 substr 提取要删除的块之前和之后的所有内容。

1
$string = '<a href="http://google.com">http://google.com</a>';
$var = explode('http://',$string);
echo $var[2]; 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接