Как я могу проверить строку с помощью регулярного выражения, пока не найду пробел?

#php #regex

#php #регулярное выражение

Вопрос:

У меня есть это регулярное выражение с помощью функции preg_replace на PHP :

 $str=preg_replace(
    '#b((Hello ). )#',
    '<a class="lforum" href="$1">$1</a>',
    $str);
  

Он проверяет все строки, которые начинаются с Hello и за которыми следуют любые символы (по крайней мере, один символ с повторением).

Так, например :

 Hello Mark \ is checked
HelloMark  \ is not checked
  

Проблема сейчас в том, что проверяется и эта строка :

 Hello Mark Cordi
  

потому что пробел — это символ, в любом случае.

Я не хочу этого. Или, лучше, если строка является Hello Mark Cordi , она должна заменять только Hello Mark .

Как я могу это сделать? Спасибо

РЕДАКТИРОВАТЬ Проблема с новой строкой

Моя фактическая функция :

 echo example(htmlentities($myString, ENT_QUOTES, "UTF-8"));

function example($str) {
    $str=preg_replace(
        '#((Hello )[^ n] )#',
        '<a class="lforum" href="$1">$1</a>',
        $str);

    return nl2br($str);     
}
  

Если $myString равен :

 Hello Mario
Ciao
  

(обратите внимание на перевод строки, поэтому в конце Hello Mario есть n) результат такой :

 <a class="lforum" href="Hello Mario<br />">Hello Mario<br /></a><br />Ciao
  

вместо :

 <a class="lforum" href="Hello Mario">Hello Mario</a><br />Ciao
  

Таким образом, он добавляет n с $ 1 при замене, и это не должно : (

Комментарии:

1. regular-expressions.info твой друг 🙂

Ответ №1:

Заменяйте только символы word, используя w вместо . :

 $str=preg_replace(
    '#b((Hello )w )#',
    '<a class="lforum" href="$1">$1</a>',
    $str);
  

Символы Word являются:

  • A-Za-z
  • 0-9
  • _

Вероятно, это то, чего вы на самом деле хотите, а не просто исключение пробела.

Комментарии:

1. @boudou Вы могли бы добавить это: [w-] написано «символы word и дефисы».

2. @lonesomeday Да, и если меня зовут Диам , я могу добавить [w-'] . Я думаю, что это проще в использовании [^ ] .

3. @boudou [^ ] немного глупо. Как насчет новых строк? Как насчет вкладок? Как насчет неразрывных пробелов? Конечно, вы должны, по крайней мере, использовать S (не пробел). Тем не менее, я почти всегда предпочитаю указывать, какие символы разрешены , а не те, которые не разрешены.

4. Да, но в моем примере мне нужно, чтобы все символы ожидали пробелов (и, конечно, перевода строки). Итак, [^ n] должно работать (должно :))

5. @kwichz И открыть скобки? И закрыть угловые скобки? И обратные косые черты? Вы тоже хотите все это? Как насчет % ? Если вам действительно нужны все символы, кроме пробела (включая (>% ), используйте S . В противном случае определите, что вы хотите ; это намного чище.

Ответ №2:

Используйте [^ ] (все, кроме пробела) вместо . .

[^abc] означает «все, кроме a, b и c«. Здесь мы используем его с одним пробелом.

Редактировать (2):

Это работает:

   $str=preg_replace(
        '#(Hello [^sn<] )#',
        '<a class="lforum" href="$1">$1</a>',
        $str);
  

Это нормально для таких строк, как эта: Mark<... , Markn... , Mark ... (замените ... на то, что вы хотите).

[^sn<] означает «все, кроме пробелов ( s ), новых строк ( n ) и < «.

Комментарии:

1. kwichz: да, вы можете избежать всего, просто поместите это в поле :: [^ t n r ]

2. С этим тоже есть проблема. Если строка является Hello MarconByeBye , она рассматривается как одно слово (поэтому пробел не является символом новой строки). Как я могу исправить эту проблему? Спасибо, чувак

3. [^ n] означает » некоторые символы (один или более) без пробела или новой строки «. Что не так?

4. Хм … но есть проблема: если я добавлю это [^ n], вывод будет включать n в $ 1 ?!?!?

5. : О Да, на самом деле, используя [^ s n], это работает отлично. С помощью [^ n] нет! Было бы неплохо понять, почему 🙂

Ответ №3:

Основываясь на вашем вопросе, разделе редактирования и различных комментариях, я считаю, что следующий код должен хорошо работать для вас:

 $str = "Hello Mario
Ciao";
var_dump(example(htmlentities($str, ENT_QUOTES, "UTF-8")));
function example($str) {
    $s=preg_replace(
        '~(HelloW [^W] )~s',
        '<a class="lforum" href="$1">$1</a>',
        $str);
    return nl2br($s);
}
  

ВЫВОД

 string(52) "<a class="lforum" href="Hello Mario">Hello Mario</a>"
  

Важно использовать s модификатор с регулярным выражением также для сопоставления новых строк и W для сопоставления пробел новая строка.

Комментарии:

1. Я не понимаю этого W [^W] ) после Hello, если честно 🙂 Также: что $ в конце? 🙂 P.s. в любом случае, остальной текст также должен быть напечатан : не проверен и заменен, но напечатан 🙂 (Так что также Чао)

2. В любом случае: #b((Hello )[^ n] )b# кажется, хорошо работает, но я не понимаю, почему это работает, а без b нет…

3. Отредактировал свой ответ, чтобы НЕ совпадать до конца строки и напечатать оставшуюся часть строки. Пожалуйста, проверьте.

4. Да, значит, это то же самое, что [^ s n], как предложил будуу 🙂 В любом случае спасибо

5. Я так не думаю. W будет соответствовать ЛЮБОМУ символу, не состоящему из слов, а не только sn .