preg_replace — как сопоставить все, что НЕ **

#php #regex #preg-replace

#php #регулярное выражение #preg-заменить

Вопрос:

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

 **(anything that's not **)**
  

Я пытался сделать это на php

 $str = "** hello world * hello **";
$str = preg_replace('/**(([^*][^*] ))**/s','<strong>$1</strong>',$str);
  

но замена строки не была выполнена.

Ответ №1:

Вы можете использовать утверждение ?! в паре с символьным . заполнителем:

 = preg_replace('/**(((?!**).) )**/s',
  

По сути, это означает сопоставление любого количества чего угодно (.) , но . никогда не может занимать место **

Ответ №2:

Вы могли бы использовать отложенное сопоставление

 **(. ?)**
# "find the shortest string between ** and **
  

или жадный

 **((?:[^*]|*[^*]) )**
# "find the string between ** and **,
#  comprising of only non-*, or a * followed by a non-*"
  

Ответ №3:

Это должно сработать:

 $result = preg_replace(
    '/**      # Match **
    (           # Match and capture...
     (?:        # the following...
      (?!**)  # (unless there is a ** right ahead)
     .          # any character
     )*         # zero or more times
    )           # End of capturing group
    **        # Match **
    /sx', 
    '<strong>1</strong>', $subject);
  

Ответ №4:

 preg_replace( '/**(.*?)**/', '<strong>$1</strong>', $str );
  

Ответ №5:

Попробуйте с:

 $str = "** hello world * hello **";
$str = preg_replace('/**(.*)**/s','<strong>$1</strong>',$str);
  

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

1. .* также, к счастью, совпадет ** .

2. да, но не последнее из них — я думаю, это то, что ему нужно

3. Подумайте **This is important** this isn't important **but this is** — ваше регулярное выражение будет соответствовать всей строке, а не только «важным» битам.

4. это верно, но в его первом примере, я думаю, что также закрытие) должно быть выделено жирным шрифтом