我使用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);
}
}
}