Регулярное выражение, соответствующее единицам атрибута в именах атрибутов, включая специальные символы - PullRequest
1 голос
/ 10 февраля 2020

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

Чего я пытаюсь достичь:

Чтобы избежать дублирования в вид, я хочу проверить, если имя атрибута содержит соответствующий блок атрибута. Например, если $attribute['name'] = "Cutting speed (in m/Min.)" и attribute['unit'] = "m/min", то атрибутная единица не должна отображаться, поскольку она уже упоминается в названии.

Как я пытаюсь добиться этого:

Я проверяю единицу атрибута, используя следующее регулярное выражение: ~\b' . attribute['unit'] . '\b~i' Это хорошо работает в вышеупомянутом примере, но не так хорошо, если единица является специальным символом, таким как % или ", например.

Проблемы

При тестировании на выпуск специальных символов я столкнулся со следующим явлением:

, если я использую это регулярное выражение /\b%\b/ он ведет себя не так, как ожидалось, и соответствует % в bla%bla, но не %, если перед ним стоит пробел: https://regex101.com/r/56iYEI/3

Похоже, % превращает поведение регулярного выражения в противоположность. Я также проверял другие «специальные символы» («и &), и они, похоже, имеют тот же эффект.

Я был направлен на этот вопрос ( Граница и специальные символы регулярного выражения» * 1038) *) прежде и прочитайте ответы. Теперь я понимаю, что \b проверяет границы слов. Но мне все еще неясно, почему он ведет себя так, как он, как только появляется % или ".

Вопросы

  1. Почему % поворачивает эту проверку границ слов на \b вокруг?
  2. Как мне достичь моего Цель матча для алфавитных единиц c, а также для специальных символов, таких как % или "?

Ждем любых подсказок. Заранее спасибо!

1 Ответ

1 голос
/ 11 февраля 2020

Разрыв слова - это точка между строкой символов слова и строкой несловесных символов (или началом, или концом). Несловарные символы не обязательно должны быть пробелами.

 foo"@#bar {}qux

В этой строке разрывы слов до и после foo, bar и qux.

Выражение /\b"@#\b/ будет сопоставлять символы между foo и bar. Однако /\b"@\b/ не будет, потому что после @.


нет слова (и, следовательно, нет разрыва слова). Чтобы решить эту проблему, проверьте либо разрыв слова, либо несловесный характер. Следующее выражение соответствует обоим случаям; /(^|\W|\b)"@($|\W|\b)/.

'~(^|\W|\b)' . attribute['unit'] . '($|\W|\b)~i'

PS Если attribute['unit'] может содержать любые символы, не забудьте процитировать его перед использованием в регулярном выражении с помощью preg_quote().

...