2012-03-12 6 views
2

Мне нужен простой регулярное выражение, которое будет работать в preg_replace, который будет преобразовывать любой входной сигнал дал его по следующим правилам:Простой preg_replace регулярное выражение, которое я не могу понять,

1) Первый символ должен быть AZ или аз

2) Если имеется более 1 символа, то следующие символы должны быть AZ, az, 0-9 или пробелом

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

У меня есть это как регулярное выражение строки:

/^[a-zA-Z][a-zA-Z0-9 ]*$/ 

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

1Athsj294-djs 

Здесь: http://www.functions-online.com/preg_replace.html

Не работает, пожалуйста, помогите. Благодаря!

+0

Просьба уточнить ваши требования. Вы хотите извлечь непрерывную подстроку из ввода или несмежную подстроку? Каков правильный вывод для ввода вашего примера, '1Athsj294-djs'? Это 'Athsj294' или' Athsj294djs', или что-то еще? –

+0

Я бы предпочел Athsj294djs, но похоже, что это не вариант ?, поэтому Athsj294 будет работать –

+0

Я закончил цепочку моего принятого ответа с помощью первого 'preg_replace' с этим шаблоном:'/[^ A-Za-z0-9 ]/', и это дало мне мой желаемый результат' Athsj294djs' –

ответ

2
$result = preg_replace('/^[^a-z]*([a-z][a-z0-9 ]*).*$/si', '\1', $subject); 

изменяет

1Athsj294-djs 

в

Athsj294 

Пояснение:

^   # Start of string 
[^a-z]*  # Match (optionally) any characters except ASCII letters 
(   # Match and capture... 
[a-z]  # one ASCII letter 
[a-z0-9 ]* # zero or more ASCII letters/digits or spaces 
)   # End of capturing group 
.*   # Match the rest of the string 
$   # Match the end of the string 

В /si модификаторы сделать REGE x нечувствителен к регистру и позволяет точке соответствовать символам новой строки.

+0

Очень приятно! Благодаря! –

+1

Вы можете захватить «djs», поскольку OP теперь уточняет, что они хотят, захватывая '(. *)' Как вторую строку соответствия, помещая ее в результат с '\ 1 \ 2', а затем второй проход, который избавляется несоответствующих символов после исходного символа соответствия: '$ result = preg_replace ('/ [^ a-z0-9] /', '', $ result);' –

0

Я думаю, что ваше регулярное выражение выглядит хорошо, за исключением вы должны удалить ^ и $

Так оно и должно быть

preg_match('/[a-zA-Z][a-zA-Z0-9 ]*/', $subject)   // this is for preg_match though 
preg_replace('/[^a-zA-Z]*([a-zA-Z][a-zA-Z0-9]*)[^a-zA-Z0-9]*/', '$1', '1Athsj294-djs') // for preg_replace 
0

Ну, вы можете захватить preg_match('/^[a-zA-Z][a-zA-Z0-9 ]*/', $string, $matches), например, а $ [0] будет содержать совпадение. Если вы хотите на самом деле preg_replace, который требует lookahead.

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