Разбор телефонных номеров в строках с использованием PHP - PullRequest
1 голос
/ 06 января 2011

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

912343267
91 234 32 67
912 343 267
34912343267
+34912343267
0034912343267
+34 912343267
+34 91 234 32 67
+34 912 343 267

Как я могу справиться с этим?Если у вас есть какие-то подсказки, буду признателен.

С наилучшими пожеланиями,


Updade1:

Я тестирую код, как в реальной среде:

$phone_list = "912343267 91 fgf ddf 234 32 67 dfffgg g 912 343 267 ffd dff fff 34912343267 ddssf f +34912343267 f fdd d 0034912343267 derd df e +34 912343267 fdd ff +34 91 234 32 67 ffd vv ff f +34 912 343 267";
$string = preg_replace('~[^0-9]~','',$phone_list);
echo $string;

Дает мне:

91234326791234326791234326734912343267349123432670034912343267349123432673491234326734912343267

Можно ли вывести числа в массиве?

С наилучшими пожеланиями,


Обновление2:

Я протестировал другой тип строки, но не смог.Я опубликую пример, если у кого-то есть какие-либо подсказки по этому поводу.

$phone_list = '</div>A Front para<br /><br /><br /><br /><br /><br />-Apoio;<br />-Criação;<br />-Campanhas;<br />-Promoções<br /><br /><br />CONDIÇÕES:<br /><br />Local de Trabalho: Es<br />Folgas: Mistas<br /><br /><br /><br />ordem 500€<br /><br /><br /><br />Mínimos:<br /><br />- Conhecimentos;<br />- Ensino ;<br />-INGLÊS.<br /><br /><br /><br />Candidaturas: <br />email@ffff.es<br />218559372 | 927 555 929 | <br />RH<br />Rua C. Sal. 40<br />1000-000 Lisboa<br /><br /><br />';
$phone_list = preg_replace('~[^0-9a-z]~i','',$phone_list);
$phone_list = preg_split('~[a-z]+~i',$phone_list);
print_r($phone_list);

Код возврата:

Array ( [0] => [1] => 500 [2] => 218559372927555929 [3] => 40 [4] => 1000000 [5] => ) 

Код должен анализировать: 218559372 и 927555929 как отдельные числа.

Есть какие-нибудь подсказки по этому поводу?

С наилучшими пожеланиями,

Ответы [ 4 ]

2 голосов
/ 06 января 2011
$string = preg_replace('~[^0-9]~','',$string);
0 голосов
/ 06 января 2011

Итак, ваш новый обновленный пример контента действительно реален для реального времени? Разбит для ясности:

$phone_list = '
</div>
A Front para
<br /><br /><br /><br /><br /><br />
-Apoio;
<br />
-Criação;
<br />
-Campanhas;
<br />
-Promoções
<br /><br /><br />
CONDIÇÕES:
<br /><br />
Local de Trabalho: Es
<br />
Folgas: Mistas
<br /><br /><br /><br />
ordem 500€
<br /><br /><br /><br />
Mínimos:
<br /><br />
- Conhecimentos;
<br />
- Ensino ;
<br />
-INGLÊS.
<br /><br /><br /><br />
Candidaturas: 
<br />
email@ffff.es
<br />
218559372 | 927 555 929 | 
<br />
RH
<br />
Rua C. Sal. 40
<br />
1000-000 Lisboa
<br /><br /><br />';

Чтобы вычеркнуть из этого числа, у вас должен быть надежный способ найти якоря или разделители, которые помечают, где находятся числа. Например, если вся эта строка и сам HTML-код не изменятся, вы можете, например, найти содержимое между 7-м и 6-м до последних тегов <br /> и перейти оттуда ...

... оттуда, похоже, если у вас несколько телефонных номеров, они разделены каналом, это правильно? Почему ты ничего не сказал об этом для начала?

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

0 голосов
/ 06 января 2011

Исходя из вашего примера строки в вашем обновлении, это, вероятно, будет вашим самым надежным решением ... но у него есть главное предостережение, что оно будет работать, только если ВСЕ номера в вашей строке будут частью телефонного номера ( нет других случайных чисел, не являющихся частью номера телефона) ...

$phone_list = "912343267 91 fgf ddf 234 32 67 dfffgg g 912 343 267 ffd dff fff 34912343267 ddssf f +34912343267 f fdd d 0034912343267 derd df e +34 912343267 fdd ff +34 91 234 32 67 ffd vv ff f +34 912 343 267";
$phone_list = preg_replace('~[^0-9a-z]~i','',$phone_list);
$phone_list = preg_split('~[a-z]+~i',$phone_list);

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

0 голосов
/ 06 января 2011

Если вам нужны только цифры из строки, используйте preg_split () для создания массива, содержащего только цифры, затем используйте следующую функцию, которая имеет необязательный параметр для кода страны:

function formatPhone($phone, $country_code = 34) {
    $pattern = '/^(00|\+)?' . $country_code . '\s?/';
    $phone = preg_replace($pattern, '', $phone);
    return str_replace(' ', '', $phone);
}
$list = preg_split('/\s([^\d+]+)/', $phone_list);
$numbers = array();
foreach ($list as $number) {
    $numbers[] = formatPhone($number);
}

$ numbers - это массив отформатированных чисел.

Следующие коды должны обрабатывать ваш код Обновления 2:

$country_code = 34;
$pattern = '/(?:\+|00)?(?:' . $country-code . ')?(\d[\d\s]{9,14})/';
preg_match_all($pattern, $phone_list, $matches);
$numbers = array();
if (isset($matches[1])) {
    foreach ($matches[1] as $match) {
        $numbers[] = str_replace(' ', '', $match);
    }
}

Ваши отформатированные номера телефонов указаны в цифрах $.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...