我正在使用PHP脚本链接字符串的每个单词:
<?
$str = "hello<br> guys good man";
$arr = explode(' ', $str);
foreach($arr as $value){
echo '<a href="http://www.dumbsearch.com/now/searchcompleted.php?q='.$value.'">'.$value.'</a>';
}
?>
如何在不链接$str
的情况下链接字符串<br>
的每个单词?
答案 0 :(得分:8)
您可以使用preg_replace
// More complext string
$str = "hello<br> guys good man <a href=\"http://google.com\">Google</a> <br /> hurry";
// Url Template
$template = '<a href="http://www.dumbsearch.com/now/searchcompleted.php?q=%1$s">%1$s</a>';
// Replace Words
echo preg_replace("/(?!(?:[^<]+>|[^>]+<\/a>))\b([a-z]+)\b/is", sprintf($template, "\\1"), $str);
输出
<a href="http://www.dumbsearch.com/now/searchcompleted.php?q=hello">hello</a>
<br>
<a href="http://www.dumbsearch.com/now/searchcompleted.php?q=guys">guys</a>
<a href="http://www.dumbsearch.com/now/searchcompleted.php?q=good">good</a>
<a href="http://www.dumbsearch.com/now/searchcompleted.php?q=man">man</a>
<a href="http://google.com">Google</a>
<br />
<a href="http://www.dumbsearch.com/now/searchcompleted.php?q=hurry">hurry</a>
答案 1 :(得分:2)
在爆炸之前/之前使用strip_tags()函数:
$arr = explode (' ', strip_tags($str));
答案 2 :(得分:2)
未经测试,但从JvO的代码开始,将链接放回原始字符串中:
$str = "hello<br> guys good man";
$arr = explode (' ', strip_tags($str));
foreach($arr as $value) {
$link = '<a href="http://www.dumbsearch.com/now/searchcompleted.php?q='.$value.'">'.$value.'</a>';
$str = str_replace($value, $link, $str);
}
echo $str;
请注意,您可以通过删除$ arr。
中的重复项来节省时间编辑:事实上,你必须从$ arr删除重复项,否则事情就会变得丑陋:
$arr = array_unique(explode (' ', strip_tags($str)));
...以及对错误原始代码的另一次编辑。
答案 3 :(得分:1)
在形成链接之前,首先处理字符串:
$proc_val = preg_replace('/<br>/', '', $value);
echo '<a href="http://foo.php?q='.$proc_val.'">'.$value.'</a>';
答案 4 :(得分:1)
不确定你在Jvo的答案的评论中说了什么,但是你也总是可以在foreach中使用striptags并且只删除链接部分。
foreach($arr as $value){
echo '<a href="http://www.dumbsearch.com/now/searchcompleted.php?q='.strip_tags($value).'">'.$value.'</a>';
}
所以这是完整的代码:
<?
$str = "hello<br> guys good man";
$arr = explode(' ', $str);
foreach($arr as $value){
echo '<a href="http://www.dumbsearch.com/now/searchcompleted.php?q='.strip_tags($value).'">'.$value.'</a>';
}
?>
你真的应该考虑explode(' ', $str)
将要做什么。
任何时候任何HTML标记都有像<span style="color: red;">
这样的属性,你就会遇到麻烦。您应该strip_tags
首先,在整个字符串上然后处理它。如果您需要稍后添加内容,请将HTML版本保留为单独的字符串。
答案 5 :(得分:1)
为什么不像现在一样爆炸字符串,只需删除URL中的标记。
$str = "hello<br> guys good man";
$arr = explode(' ', $str);
foreach($arr as $value){
echo '<a href="http://www.dumbsearch.com/now/searchcompleted.php?q='.strip_tags($value).'">'.$value.'</a>';
}
这将输出以下HTML,这是我认为你想要的。
<a href="http://www.dumbsearch.com/now/searchcompleted.php?q=hello">hello<br></a>
<a href="http://www.dumbsearch.com/now/searchcompleted.php?q=guys">guys</a>
<a href="http://www.dumbsearch.com/now/searchcompleted.php?q=good">good</a>
<a href="http://www.dumbsearch.com/now/searchcompleted.php?q=man">man</a>
答案 6 :(得分:0)
如果字符串很长,并且可以包含任意数量的标记,包括<p>
,<h1>
和<br>
以及更正确的<br/>
,那么您可以考虑解析该批次,并使用str_replace
:
$string = 'Foo<br/>Hello Bar!';
$DOM = new DOMDocument;
//make sure all breaks are preceded by a space, if not words might be concatenated by accident
$DOM->loadHTML(str_replace('<br', ' <br', $string));
//get all nodes
$nodes = $DOM->getElementsByTagName('*');
//get the text, split it and replace, but keep track of replaced words
$replaced = array();
for ($i = 0, $j = $nodes->length; $i<$j;$i++)
{
$words = explode(' ',$nodes->item($i)->nodeValue);
while($word = array_shift($words))
{
if (!array_key_exists($word, $replaced))
{//avoid replacing twice (and thus creating a link within a link)
$replaced[$word] = true;
$string = str_replace($word, '<a href="http://www.dumbsearch.com/now/searchcompleted.php?q='.urlencode($word).'">'.$word.'</a>', $string);
}
}
}
此代码经过测试并正常运行。