【问题标题】:Link each word of string WITHOUT linking <br>链接字符串的每个单词而不链接 <br>
【发布时间】:2013-01-11 00:54:07
【问题描述】:

我正在使用 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>';
}
?>

如何在不链接&lt;br&gt;s 的情况下链接字符串$str 的每个单词?

【问题讨论】:

标签: php string


【解决方案1】:

你可以使用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>

【讨论】:

  • 很好的答案,你能澄清一下sprintf相关代码的需要吗?
  • @DoubleGras 我不想将值连接两次,而且它的旧习惯也很难改掉,看看为什么:stackoverflow.com/questions/1386593/…
  • 明白了。它只是有点模块化,所以你可以通过很多方法来喂模板而不用碰它。
  • 类似的东西.... :) 更多信息请参见 PHP 文档php.net/manual/en/function.sprintf.php
【解决方案2】:

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

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

【讨论】:

  • 但是如何在回显结果中保留brs?
【解决方案3】:

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

...对原始代码进行另一次编辑以发现错误。

【讨论】:

  • 你能说得更具体点吗?会发生什么?
  • 只是与原作相呼应。 :( 没有链接等
  • 天啊! $str = str_replace(...)
  • 不,它不起作用。 :( 即使我使用 arry unique ,它也是完全混乱和不合时宜的,而且看起来什么都不对。:( (请注意,我正在处理我的字符串中的一些奇怪的字符,也许这可能是导致它的原因,但我想要修复它),谢谢!;)
  • 是的,最终我认为这种方法太不稳定了。如果“搜索”在原始字符串中,事情就会变得一团糟。可以解决所有这些问题,但是如果您首先使用explode() 创建数组,那么上面的hellohellosharp 有一个更好的解决方案。如果除了
    之外还有更复杂的标签也会有问题,但除此之外看起来非常好。对于更防弹的解决方案,preg_match() 和 preg_replace() 是适合这项工作的工具。
【解决方案4】:

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

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

【讨论】:

  • 但是如何在回显结果中保留brs?
【解决方案5】:

不确定您在 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 标记都具有像 &lt;span style="color: red;"&gt; 这样的属性,你就会遇到麻烦。你应该strip_tagsfirst,在整个字符串上,然后处理它。如果您以后需要添加内容,请将 HTML 版本保留为单独的字符串。

【讨论】:

  • 但是如何在回显结果中保留brs?
  • 我的答案的第一个代码部分将从 URL 中删除标签,但将它们保留在实际显示的部分中。看这部分:searchcompleted.php?q='.strip_tags($value).'"&gt;'.$value.'&lt;/a&gt;';
  • 但它显示如下:致命错误:在第 111 行的 /home/content/76/7290476/html/dumbocr/post.php 中调用未定义函数 striptags()
  • 发现了问题,striptags 函数中缺少下划线。您可能想要编辑原始答案。非常感谢!现在可以了!
  • 生成的文本看起来很难看,即链接中到处都有换行符,许多词链接到同一个词等。 :(
【解决方案6】:

为什么不像现在一样分解字符串并简单地去除 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>

【讨论】:

    【解决方案7】:

    如果字符串很长,并且可以包含任意数量的标签,包括&lt;p&gt;&lt;h1&gt;&lt;br&gt;以及更正确的&lt;br/&gt;,你可以考虑解析很多,并使用@ 987654325@:

    $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);
            }
        }
    }
    

    此代码已经过测试并且可以运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-11
      • 2011-06-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多