найдите слово и выделите его с помощью php

мой вопрос заключается в том, что я хочу найти слово в заданной строке, и изменение фона этого слова при каждом нажатии кнопки и счетчике увеличивается так же, как поиск в любом редакторе.

<?php 

function writeMsg()
{
$str = "my bird is funny, we fun are funny,they are     funny they are fun";
$keyword =$_GET['search'];
$strarr=explode(" ",$str);
//print_r($strarr);

    foreach ($strarr as $val) 
    {
   //print_r($val); 
   if($val==$keyword)
   {echo hi;
   $copy_date = preg_replace("/$keyword\b/",'<b     style=background-color:yellow;>'.$keyword.'</b>',   $val);
   print $copy_date;   
   }
   else
   {
   echo $val;  
   }    }
//}
?>
<html>
    <form action="#" method="get">
    Please enter word to search<input type="text"   name="search"><br/>
<input type="button" value="NEXT"   onclick="document.write('<?php 'writeMsg()';?>');" />

    </form>
</html>

person user3230719    schedule 24.01.2014    source источник
comment
php работает на стороне сервера, то есть до того, как html прибудет, вся обработка php будет выполнена. Поэтому вам нужно использовать что-то вроде JavaScript, чтобы получить функцию, которая взаимодействует с пользователем так, как вы хотите. Будет ли это приемлемой альтернативой для вас (вы конкретно спрашиваете о php…)   -  person Floris    schedule 24.01.2014
comment
Вы получаете какую-либо ошибку?   -  person Rahul Desai    schedule 24.01.2014
comment
лучше.... используйте ‹span› ‹/span›   -  person user1844933    schedule 24.01.2014
comment
Вы хотите, чтобы все слова выделялись одним нажатием кнопки; добавить еще один блик за клик; или переместить выделение на следующий элемент?   -  person Floris    schedule 24.01.2014


Ответы (4)


Если вы не используете регулярное выражение, str_replace() подойдет. Есть даже встроенный счетчик.

<?php 
function writeMsg(){
    $count = 0;
    $str = "my bird is funny, we fun are funny, they are funny they are fun";
    $keyword = $_GET['search'];
    $str = str_replace($keyword, "<b style='background-color:yellow;'>".$keyword."</b>",$str,$count);
    echo "There were ".$count." matches.<br />";
    echo $str;
}
?>
<html>
    <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="get">
        Please enter word to search: <input type="text" name="search"><br/>
        <input type="submit" value="NEXT" />
    </form>
    <?php
    if(isset($_GET['search'])){
        writeMsg();
    }
    ?>
</html>
person I wrestled a bear once.    schedule 24.01.2014
comment
Голосую за это, поскольку оно фактически показывает, как вызывать сервер для выполнения обработки php. - person Floris; 24.01.2014
comment
Замена точно работает. но что произойдет, если ключевое слово в ссылке? например ‹a href='keyword.htm'›вот мое ключевое слово‹/a› Это сломает ссылку - person Steve; 24.01.2014
comment
@Adelphia, ну ладно, давайте просто дадим ему код, в котором есть потенциальный скрытый недостаток. - person Steve; 24.01.2014
comment
простой вопрос заслуживает простого ответа. - person I wrestled a bear once.; 24.01.2014

Вы можете сделать это с помощью всего лишь str_replace функции.

<?php
$str = "my bird is funny, we fun are funny,they are     funny they are fun";
$str1=$str;

echo $str."<br/>";


$find="funny"; 
$str=str_replace($find,'<span style="color:red">'.$find.'</span>',$str);

echo $str."<br/>"; //If keyword exists displays updated string

$find="funky"; 
$str=str_replace($find,'<span style="color:red">'.$find.'</span>',$str1);

echo $str; //If keyword doesn't exist, Just display the same string
?>
person Jenson M John    schedule 24.01.2014

Все ответы до сих пор не касаются того, что происходит, если ключевое слово используется в ссылке.

Вот мое решение. Возможно, он не идеален, но позволяет это сделать.

//this code will highlight the search string in the returned search results.  It ignores text within tags

function doHighlight ($strneedle, $strhaystack){

//this fixes bug if first char is a <
if(strpos($strhaystack,"<")==0) {$strhaystack = " " . $strhaystack;}

$strhaystack = str_replace("\"","'",$strhaystack);
$newthought = "";
$i = 0;
    //only do it if we have a tag
    $findtag = strpos($strhaystack,"<");

    if ($findtag > 0){

        //count how many tags we have 
        $strCount = substr_count( $strhaystack,"<");

        //and loop that many times
        while($i < $strCount){
            $i++;
            //find opening tag
            $pos = strpos( $strhaystack,"<");
            //get text to left of opening tag
            $thoughtstart = substr($strhaystack , 0, $pos);
                //highlight that text
                $pattern = $strneedle;
                $replacement = '<span class="highlight">'.$strneedle.'</span>';
                $highlightedthought = eregi_replace($pattern, $replacement, $thoughtstart);
                //build the new string
                $newthought = $newthought . $highlightedthought;

            //find closing tag and concatenate it to new string without highlighting
            $thoughtremainder = substr($strhaystack, $pos);
                $pos = strpos( $thoughtremainder,">");
                $thoughtstart = substr($thoughtremainder , 0, $pos);
                $newthought = $newthought . $thoughtstart;      

            //make the rest of the thought the new string and loop
            $strhaystack = substr($thoughtremainder, $pos); 
        }
    }
    //if no tag, return the highlighted thought
    else{
        $pattern = $strneedle;
        $replacement = '<span class="highlight">'.$strneedle.'</span>';
        $newthought = eregi_replace($pattern, $replacement, $strhaystack);
        }

return (trim($newthought));
}
person Steve    schedule 24.01.2014

Простая реализация Javascript:

String:  <input type = "text" id = "mystring">
<p>&nbsp;</p>
<div id = "mystringdiv" style="width:400px; height:120px; border:solid black 1px;"></div>

Word to search: <input type = "text" id = "searchstring"><input type = "button" value = "Search" onclick = "startSearch()">

<script type = "text/javascript">
function startSearch()
{
    var search = new RegExp(document.getElementById("searchstring").value, "g")
    var string = document.getElementById("mystring").value

    var nstring = string.replace(search, "<b style=\"background-Color:#FFFF00\">"+document.getElementById("searchstring").value+"</b>")

    document.getElementById("mystringdiv").innerHTML=nstring

}
</script>

http://jsfiddle.net/dRW84/

person SyntaxLAMP    schedule 24.01.2014
comment
Почему за это проголосовали? Javascript кажется лучшим выбором, чем использование PHP, поскольку он не требует отправки формы или вызова AJAX для обработки ввода и выделения. - person SyntaxLAMP; 24.01.2014
comment
Я думаю, что на самом деле это стоит того, чтобы проголосовать за, а не против. JS почти наверняка является правильным способом сделать это, хотя я не уверен, что ваш код не выделяет все совпадения сразу, а не один раз за клик. Но на этот счет вопрос был двусмысленным. - person Floris; 24.01.2014
comment
Он работает со всеми совпадениями, поэтому g в регулярном выражении означает глобальный. Проверьте это: jsfiddle.net/dRW84 - person SyntaxLAMP; 24.01.2014
comment
Извините за двойное отрицание: я хотел сказать, что думаю, что он выделяет все совпадения сразу, а не еще одно при каждом щелчке. Я не уверен, что это логически не то же самое, что и я уверен, но вы поняли идею. - person Floris; 24.01.2014
comment
@SyntaxLAMP, а что произойдет, если ключевое слово находится внутри ссылки или окажется именем элемента или чем-то еще в исходном коде страницы? - person Steve; 24.01.2014
comment
Это только перезапись строки, которую вы ей даете, а не всей страницы. - person SyntaxLAMP; 24.01.2014