Свяжите каждое слово строки без ссылки <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?

+1
источник поделиться
7 ответов

Вы можете просто использовать 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>
+8
источник

Используйте функцию strip_tags() до/в вашем взрыве:

$arr = explode (' ', strip_tags($str));
+2
источник

Untested, но начните с кода 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)));

... и другое редактирование исходного кода для ошибки.

+2
источник

Прежде чем сформировать ссылку, сначала обработайте строку:

$proc_val = preg_replace('/<br>/', '', $value);
echo '<a href="http://foo.php?q='.$proc_val.'">'.$value.'</a>';
+1
источник

Не уверен, что вы говорили в комментарии ответа Jvo, но вы всегда можете использовать striptags в foreach, а также только линять ссылку.

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 вы должны strip_tags, на всей строке, а затем обработать его. Храните HTML-версию в виде отдельной строки, если вам нужно добавить материал позже.

+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>
+1
источник

Если строка довольно долго, и может содержать любое количество тегов, включая <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);
        }
    }
}

Этот код проверен и работает.

0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос