链接字符串的每个单词而不链接<br/>

时间:2013-01-11 00:54:07

标签: php string

我正在使用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>的每个单词?

7 个答案:

答案 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);
        }
    }
}

此代码经过测试并正常运行。