У меня есть поле описания текста для классифицированных объявлений на сайте. Существует отдельное поле для ввода номера телефона для связи с человеком, но многие люди вводят телефон в описание, которое я не хочу.
Я использую регулярные выражения для фильтрации, если они введены в числовом формате, но они становятся действительно креативными и используют буквы. Есть ли способ отфильтровать это с помощью регулярных выражений или какой-то предварительной обработки поля.
Вот пример кода (который работает только для телефона как числа):
$phone = '0888123123';
$text = 'Some description with phone set to 0888123123 as well as zero eight eight eight one two three one two three.';
preg_match_all('/('.implode('[\D]*', str_split($phone)).')/i', strip_tags($text), $matches);
if (count($matches) > 0) {
foreach($matches as $value) {
$text = str_replace($value, $phone, $text);
}
}
Я думаю о замене каждой буквы на число из массива, как array('one'=>1)
и это будет работать, за исключением случаев, когда у них есть номер где-то еще в тексте, он также заменит его. Есть ли способ обновить регулярное выражение, чтобы поймать регистр букв для этого номера телефона?
РЕДАКТИРОВАТЬ:
Я обновил регулярное выражение с массивом для чисел в буквенном формате, но есть еще одна проблема. Если номер телефона появляется в тексте более одного раза, он не работает:
$text = 'Some description with phone set to 0888123123 as well as zero eight eight eight one two three one two three and a second time - zero eight eight eight one two three one two three.';
$phone_digits = array(0=>'zero',
1=>'one',
2=>'two',
3=>'three',
4=>'four',
5=>'five',
6=>'six',
7=>'seven',
8=>'eight',
9=>'nine');
$phone_letters = array();
foreach (str_split($phone) as $number)
{
$phone_letters[] = "($number|$phone_digits[$number])";
}
preg_match_all('/('.implode('[\D]*', $phone_letters).')/i', $text, $matches);
Он соответствует буквам, но не останавливается на последнем номере телефона:
Матчи: «ноль восемь восемь восемь один два три один два три и второй раз — ноль восемь восемь восемь один два три один два три».
вместо сопоставления дважды:
«ноль восемь восемь восемь один два три один два три»
Может ли preg_match не быть жадным и останавливаться, когда найдено первое совпадение, а затем обрабатывать оставшуюся часть строки для дополнительных совпадений?
Задача ещё не решена.
Других решений пока нет …