preg_match соответствует необязательному символу, а затем игнорирует оставшийся текст

У меня есть следующий формат строки:

[[TEXT|TEXT]] <-- the "|TEXT" is optional

И пока что хорошо работает:

/([^\[]+)(?=\]\])/

Который вернется:

TEXT
or
TEXT|TEXT

Я хочу сопоставить до "|TEXT", если он был включен, и совпадать только с левой стороной "|" или "]]" в зависимости от того, что является первым.

Какие-либо предложения?

1 ответ

Решение

ОБНОВЛЕНИЕ - если вы хотите только соответствовать тому, что в [[]] и не включая |TEXT если это там, попробуйте это:

([^|\[]+?)(?=(?:\]\]|\|))

Что более или менее ваше начальное регулярное выражение, но оно останавливается на | или ]],

Или, если ваш regex-фреймворк поддерживает просмотр, вы можете сделать следующее:

((?<=\[\[)([^\|]+?)(?=(?:\]\]|\|))

Это только подтверждает, что вы совпадаете с [[ и далее. Не совсем необходимо, но немного более неизвестно, что доказательство содержания.

Другие вопросы по тегам