#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
.