Поиск и замена каждого уникального слова, которое начинается с символа @ в строке, даже если они похожи - PullRequest
1 голос
/ 02 мая 2020

Я хочу заменить все вхождения в строке, начинающиеся с @. Если я использую str_replace, все работает нормально, пока имена пользователей не станут похожими. Мне нужно что-то, чтобы полностью заменить точные уникальные слова, не затрагивая другие похожие слова. Пример @johnny и @johnnys будет проблематичным c. Может быть, может помочь регулярное выражение?

function myMentions($str){
    $str = "Hello @johnny, how is @johnnys doing?"; //let's say this is our param

     $regex = "~(@\w+)~"; //my regex to extract all words beginning with @ 

            if(preg_match_all($regex, $str, $matches, PREG_PATTERN_ORDER)){ 

                foreach($matches[1] as $matches){ //iterate over match results

    $link = "<a href='www.google.com'>$matches</a>"; //wrap my matches in links

    $str = str_replace($matches,$link,$str); //replace matches with links

    }
    }
    return $str;
}

Вывод должен быть: Hello <a href=''>@johnny</a>, how is <a href=''>@johnnys</a> doing?

Вместо этого я получаю: Hello <a href=''>@johnny</a>, how is <a href=''>@johnny</a> s doing? (ПРИМЕЧАНИЕ: дополнительные "s" на @johnnys не переносятся )

Он не распознает, что @johnny и @johnnys - это два разных слова, поэтому str_relace оба слова в одном go. В основном функция берет одно слово и заменяет все похожие слова сразу.

1 Ответ

1 голос
/ 02 мая 2020

Ваш код неоправданно сложен, вам просто нужно просто preg_replace:

function myMentions($str){
     return preg_replace("~@\w+~", "<a href='www.google.com'>\$0</a>", $str);
}

$str = "Hello @johnny, how is @johnnys doing?";
echo myMentions($str);
// => Hello <a href='www.google.com'>@johnny</a>, how is <a href='www.google.com'>@johnnys</a> doing?

См. PHP demo .

The preg_replace("~@\w+~", "<a href='www.google.com'>\$0</a>", $str) сопоставляет все непересекающиеся вхождения @ + 1 или более символов слова и заключает их в тексты <a href='www.google.com'> и </a>. Обратите внимание, что $0 является обратной ссылкой на весь матч.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...