Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Граница слова preg_replace (https://javascript.ru/forum/server/71117-granica-slova-preg_replace.html)

DivMan 27.10.2017 02:06

Граница слова preg_replace
 
Не понимаю, почему находит простое слово, если я указал границу?

$str = 'http://site.ru, http://site.com, https://site.info sgdf';
 
echo preg_replace('#\b(https?://)([a-z0-9-]+)\.([a-z]{2,})\b#', '<a href="$1$2.$3">$2.$3</a>', $str);


Должно вывести site.ru, site.com, site.info

а выводит site.ru, site.com, site.info sgdf

Белый шум 27.10.2017 03:16

Не находит - оставляет без изменений.

ksa 27.10.2017 08:41

Цитата:

Сообщение от DivMan
Должно вывести site.ru, site.com, site.info

Тогда, как вариант
var str='http://site.ru, [url]http://site.com[/url], [url]https://site.info[/url] sgdf, https://test.ru';
alert(str.match(/(https?:\/\/)(.+?)\.(.+?)(?=\s|,|$)/g));

laimas 27.10.2017 08:56

ksa,
это же сервер и он прекрасно справится, в отличии от JS в этом плане у него куда большие возможности. ) Просто в данном случае граница слова совсем не требуется.

$str = 'http://site.ru, http://site.com, https://site.info sgdf';
  
echo preg_replace('~(https?://)([^\s,]+)~', '<a href="$1$2">$2</a>', $str);

DivMan 27.10.2017 11:40

Я понял, спасибо.

DivMan 02.11.2017 02:01

Я сделал, что бы текст менялся, если есть одиночные звёздочки, в первой строчке, работает, как надо, а во второй работает неправильно, том должна быть вся строка курсивом, почему она не закурсивилась?

echo preg_replace('#(?<!\*)\*([a-zA-Z\s\.]+)\*(?!\*)#i', '<em>$1</em>', '**bold text with *italic* **');
    echo '<br>';
    echo preg_replace('#(?<!\*)\*([a-zA-Z\s\.]+)\*(?!\*)#i', '<em>$1</em>', '*italic text **with bold** *');

Белый шум 02.11.2017 03:04

Потому что в строке между одинарными звёздочками есть символы, не подпадающие под правило "[a-zA-Z\s\.]+".

Код:

php -r 'echo preg_replace("#(?<!\*)\*(([a-zA-Z\s\.]|\*\*+)+)\*(?!\*)#i", "<em>$1</em>", "*italic text **with bold** *"), "\n";'

DivMan 02.11.2017 15:16

Не понимаю, я в условие написал {1,} это значит, если повторяется больше одного раза, то это всё удалить, но почему не во всех случаях удаляет?

echo preg_replace('#([\w]+)\s\1{1,}#', '$1', 'hello my my  my  my my world')


//hello world world - работает
//hello world world world - не работает
//hello world world world world - не работает
//hello hello world - работает
//hello hello hello hello world - плохо работает
//hello my my world - работает
//hello my my my world - плохо работает

ksa 02.11.2017 15:29

Цитата:

Сообщение от DivMan
я в условие написал {1,} это значит, если повторяется больше одного раза

Можно тогда указать "+"... ;)

DivMan 02.11.2017 15:38

Заменил {1,} на + и не работает


Часовой пояс GMT +3, время: 23:53.