#php #regex
#php #регулярное выражение
Вопрос:
Почему это регулярное выражение не соответствует пробелам в тексте между круглыми скобками? ((?:((s>)|(s{2,})|(s))))
Текст под ним, который не заключен в круглые скобки, следует игнорировать. Это просто есть. Об этом не нужно беспокоиться. Нужно касаться только тех, которые указаны в круглых скобках.
( R:2379; L: 28 ) //replace to (R:2379;L:28)
R:2379;L:28
(R:2432;L:28) // ok, no replacements needed
R:2432; L:28
( R : 2475; L: 28 ) // replace to (R:2475;L:28)
R:2475; L:28
( R : 2480 ; L:28 ) // replace to (R:2480;L:28)
R:2480; L:28
Редактировать:
( R:2379; L: 28 ) //replace to (R:2379; L:28) #a single space is ok, except before or after a parentheses. Multiple spaces are reduced to blank.
(R:2432;L:28) // ok, no replacements needed
(R:2432; L: 28) // ok, no replacements needed. The single spaces are not before or after the parentheses
( R : 2475; L: 28 ) // replace to (R:2475; L:28) #the single space before the L is fine. other multiple spaces are blanked
( R : 2480 ; L: 28 ) // replace to (R:2480; L: 28) #the single space before the 28 is fine
Комментарии:
1. В PHP для замены всех пробелов между круглыми скобками используется либо
preg_replace_callback('/([^()]*)/', function ($m) { return preg_replace('/s /', '', $m[0]); }, $string)
, либоpreg_replace('/(?:G(?!A)|()[^()]*?Ks (?=[^()]*))/', '', $string)
2. Извините, я должен был использовать слово
match
неreplace
3. Да, то же самое.
{2,}
4. Не могли бы вы объяснить логику последнего примера?
( R : 2480 ; L: 28 ) // replace to (R:2480; L: 28) #the single space before the 28 is fine
. Почему бы не сохранить отдельные пробелы с обеих сторон:
? Это одиночные пробелы.5. Конечно, никаких проблем. Пробел перед в
L
порядке, и пробел перед28
также в порядке. Я должен был упомянуть об этом при редактировании. Пробел перед)
будет заменен на''
Ответ №1:
Вы можете использовать
preg_replace('/(?:G(?!A)|()[^()]*?K(?:(?<=()s |s (?=))|s{2,})(?=[^()]*))/', '', $string)
Смотрите демонстрацию регулярных выражений. Подробные сведения:
(?:G(?!A)|()
— либо конец предыдущего соответствия, либо(
[^()]*?
— ноль или более символов, отличных от(
,)
, как можно меньшеK
— опустить текст, совпадающий до сих пор(?:(?<=()s |s (?=))|s{2,})
— 1 пробелы сразу после(
или 1 пробелы прямо перед(
и любые два или более пробельных символа(?=[^()]*))
— за которыми следуют любые 0 или более символов, кроме(
and)
, а затем a)
.
Комментарии:
1. Можно
{2,}
ли оставить часть как есть?2.@jmenezes Тогда это не даст вам ожидаемого результата, см.
(?:G(?!A)|()[^()]*?Ks{2,}(?=[^()]*))
Демонстрацию.3. Один пробел в порядке, за исключением случаев, когда этот пробел находится перед
(
или)
. Вот почему я использовал три|
4. Итак,
(?:G(?!A)|(s )[^()]*?Ks{2,} (?!))(?=[^()]*))
? Смотрите демонстрацию .5. Я имел в виду, что после a или перед a не должно быть никакого конечного пробела
(
)
. Можно использовать один пробел в любом другом месте.