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>';
}
?>

$strsをリンクせずに文字列の各単語をリンクするにはどうすればよい<br>ですか?

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

リンクを作成する前に、まず文字列を処理します。

$proc_val = preg_replace('/<br>/', '', $value);
echo '<a href="http://foo.php?q='.$proc_val.'">'.$value.'</a>';
于 2013-01-11T00:59:01.857 に答える
1

Jvoの回答のコメントで何を言っているのかわかりませんが、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 まず、文字列全体処理してから処理する必要があります。後で何かを追加する必要がある場合は、HTMLバージョンを別の文字列として保持します。

于 2013-01-11T01:03:43.673 に答える
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 に答える
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 に答える