链接字符串的每个单词,不要链接<br>


Link each word of string WITHOUT linking <br>

我使用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> s?

您可以直接使用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>

在爆炸前/中使用strip_tags()函数:

$arr = explode (' ', strip_tags($str));

未经测试,但从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)));

…并对原始代码进行另一次错误编辑。

在形成链接之前,先处理字符串:

$proc_val = preg_replace('/<br>/', '', $value);
echo '<a href="http://foo.php?q='.$proc_val.'">'.$value.'</a>';

不知道你在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版本保留为单独的字符串。

为什么不像现在这样把字符串拆开,简单地去掉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>

如果字符串相当长,并且可以包含任意数量的标记,包括<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);
        }
    }
}