1

我正在使用 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 的情况下链接字符串的每个单词?

4

7 回答 7

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>
于 2013-01-13T22:03:43.137 回答
2

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

$arr = explode (' ', strip_tags($str));
于 2013-01-11T00:57:45.397 回答
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)));

...以及对原始代码的另一次编辑以获取错误。

于 2013-01-11T01:06:13.100 回答
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>
于 2013-01-18T02:14:06.547 回答
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 版本保留为单独的字符串。

于 2013-01-11T01:03:43.673 回答
1

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

$proc_val = preg_replace('/<br>/', '', $value);
echo '<a href="http://foo.php?q='.$proc_val.'">'.$value.'</a>';
于 2013-01-11T00:59:01.857 回答
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);
        }
    }
}

此代码经过测试并且可以正常工作。

于 2013-01-20T13:06:54.070 回答