Как заменить текст, только если он окружен пробелами в php - PullRequest
0 голосов
/ 24 июня 2018

Я пытаюсь создать форму, которую пользователи могут отправлять и использовать для поиска и замены текста в длинной строке. Однако многие из строк, которые я заменяю, содержат всего 2-3 буквы (например, «od», «ph»), которые часто встречаются в середине слов. Я хотел бы просмотреть все фразы, которые я ищу, и заменить их только в том случае, если перед строкой есть пробел, чтобы избежать замены строк, находящихся в середине слов. Есть идеи?

if(isset($_POST["text"]))
{
    $original = $_POST["text"];
    $abbreviation= array();
    $abbreviation[0] = 'od';
    $abbreviation[1] = 'rn';        
    $abbreviation[2] = 'ph';
    $abbreviation[3] = 'real';  
    $translated= array();
    $translated[0] ='odometer';
    $translated[1] ='run';
    $translated[2] ='pinhole';
    $translated[3] ='fake';
    $newtext=  str_ireplace ($abbreviation, $translated ,$original);
    echo nl2br(htmlspecialchars($newnote));
}

1 Ответ

0 голосов
/ 24 июня 2018

Вы можете рассматривать аббревиатуру как отдельное слово, используя утверждение границы слова (\b) с обеих сторон:

preg_replace('/\bod\b/i', 'odometer', 'od test od test od.')
// "odometer test odometer test odometer."

Если вы строго хотите сопоставлять только при наличии пробела, окружающего строку, используйте утверждение обратного взгляда ((?<=) и утверждение предпросмотра ((?=), соответствующее пробелу (\s):

preg_replace('/(^|(?<=\s))od((?=\s)|$)/i', 'odometer', 'od test od test od.')
// "odometer test odometer test od."

Обратите внимание, что период трейлинга трактуется по-разному. (Также обратите внимание, что preg_replace может принимать несколько сопоставлений шаблонов / замен в качестве массивов.)

Из документов :

Граница слова - это позиция в строке темы, где текущий символ и предыдущий символ не совпадают с \ w или \ W (т.е. один соответствует \ w, а другой соответствует \ W) или началу или концу строка, если первый или последний символ соответствует \ w, соответственно.

\w и \W относятся к символам "word" и "non-word":

Символ «слово» - это любая буква, цифра или символ подчеркивания, то есть любой символ, который может быть частью Perl-слова. определение букв и цифр контролируется символом PCRE таблицы, и могут отличаться, если происходит сопоставление для конкретной локали. За Например, в локали "fr" (французский) некоторые коды символов больше чем 128 используются для акцентированных букв, и они соответствуют \ w.

...