2016-02-26 2 views
0

Я ищу, чтобы соответствовать все строки, которые имеют комбинацию _ [[или]] _
заменить только часть регулярных выражений матча

Та часть меня вниз: (_\[\[)|(\]\]_)
Сейчас идет часть, где мне нужна помощь, хотя, как заменить только подчеркивание в этих случаях?

Другими словами, строка: "_[[2, verb//substantiv//adjektiv]]_" приведет к строке: "[[2, verb//substantiv//adjektiv]]"

Цените любую помощь я могу получить.

+0

Есть * многие диалекты обычного нажатия: http://www.regular-expressions.info/ Чтобы получить эффективную помощь, вы должны указать, на каком языке вы их используете. Bash? C? Рубин? –

+0

Приношу свои извинения. Я использую PhP. –

+0

вы можете сделать это в первом шаблоне, избегая улавливать подчеркивание, дайте нам свой использованный шаблон –

ответ

2

Решение, которое вы можете использовать здесь, состоит в том, чтобы просто сопоставить весь шаблон и заменить его на один и тот же шаблон без подчеркивания подчеркивания (_).

I created the example here btw.

Пример:

$str = 'My _[[string to parse]]_ with some _[[examples]]_'; 
$parsed = preg_replace('/_\[\[([^(\]\]_)]*?)\]\]_/', "[[$1]]", $str); 
echo $parsed; 

Выход:

Моя [[строка для разбора]] с некоторыми [[примеры]] объяснены

Regex:

  • _\[\[ отправной точки последовательности вы хотите, чтобы захватить
  • ([^((\]\]_))]*?) захватывает содержимое того, что находится между открывающей и закрытием последовательностью, не сама последовательность закрытия
  • \]\]_ последовательность закрытия

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

Это делается во втором аргументе preg_replace, который "[[$1]]"

$1 здесь выступает за захваченной группу и содержит его содержимое, которое будет интерполированным между двумя наборами квадратных скобок.

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

+0

Работает как очарование и приходит с красивым объяснением. Спасибо. –

0

Я использую этот шаблон как пример.
Целью здесь является использование скользящей скобки. Если шаблон совпадает, вы найдете свою захваченную строку в индексе n ° 1 в совпадениях.

Пример:

$pattern = '#_(\[\[[0-9]+\]\])_#'; 
    $result = preg_match_all($pattern, '_[[22555]]_ BLA BLA _[[999]]_', $matches); 

    if (is_int($result) && $result > 0) { 
     var_dump($matches[1]); 
    } 

ВЫВОД

array(2) { 
    [0]=> 
    string(9) "[[22555]]" 
    [1]=> 
    string(7) "[[999]]" 
} 
+0

Спасибо, Халайем, но это не тот шаблон, который я использую. И я не думаю, что полностью слежу за тем, что вы делаете. –

0

Попробуйте использовать шаблон, чтобы захватить скобки [] и заменяя матчи с тем, что вы захватили, что-то вроде этого:

$pattern = "/_(\[\[)|(\]\])_/"; 
$test = "_[[2, verb//substantiv//adjektiv]]_"; 
$replace = preg_replace($pattern ,"$1$2", $test); 
echo $replace; 

Знак доллара $ позволяет вам вернуть ссылку на то, что вы сделали с помощью скобки. $1 означает первую группу захвата, в данном случае (\[\[), что означает первую пару скобок, $2 ссылается на вторую пару кронштейнов. Поскольку ваш шаблон использует оператор |, только одна из ваших групп захвата будет иметь совпадение, другая будет пуста.

+0

Я думаю, что вы можете что-то сделать, вам нужно будет провести некоторое исследование «$ 1 $ 2». Это не то, с чем я знаком. –

2

Вы могли бы придумать:

$regex = '~ 
       _\[{2} # look for an underscore and two open square brackets 
       ([^]]+) # capture anything that is not a closing bracket 
       \]{2}_ # followed by two closing square brackets and an underscore 
      ~x';  # free space mode for this explanation 
$string = "_[[2, verb//substantiv//adjektiv]]_"; 

# in the match replace [[(capture Group 1)]] 
$new_string = preg_replace($regex, "[[$1]]", $string); 
// new_string = [[2, verb//substantiv//adjektiv]] 

См a demo on regex101.com, а также on ideone.com.

1

Если вы хотите

матча все строки, имеющие комбинацию _[[ или ]]_

Вы можете использовать это регулярное выражение:

^(?=.*_\[\[).+|(?=.*\]\]_).+$ 

^    // start of the string 
(?=.*_\[\[)  // if the string contains _[[ 
.+    // get the entire string (if the assert is correct) 
|    // OR operands (if the assert is not correct, let's check the following) 
(?=.*\]\]_)  // if the string contains ]]_ 
.+    // get the entire string 
$    // end of the string 

Demo here

Смежные вопросы