2008-10-21 2 views
4

У меня есть регулярное выражение, которое я использую с sed, но теперь мне нужно заставить его работать и в PHP. Я не могу использовать системные вызовы, поскольку они отключены.Преобразование строки sed в PHP

 
$ cat uglynumber.txt: 
Ticket number : 303905694, FOO:BAR:BAR: Some text 
Case ID:123,456,789:Foobar - Some other text 
303867970;[FOOBAR] Some text goes here 
Case Ref: 303658850 - Some random text here - host.tld #78854w 
 
$ cat uglynumbers.txt | sed "s/[, ]//g;s/.*\([0-9]\{9\}\).*/\1/g" 
303905694 
123456789 
303867970 
303658850 

Итак, как сделать то же самое с PHP?

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

 
if (preg_match("/.../", $line, $matches)) { 
    echo "Match was found"; 
    echo $matches[0]; 
} 
+0

Примите тот ответ, который вам помог. :) – Till 2008-10-22 01:48:23

ответ

2

Ваш конкретный пример SED, очевидно, 2 регулярные выражения, 1 являются заменой запятые, и один технически захватывая 9 цифр непрерывные номера.

Первая половина вашей строки SED лучше всего подходит для функции preg_replace().

//`sed s/regex/replace_value/flags` 

preg_replace('/regex/flags', 'replace_value', $input); 

Вторая половина вашей строки SED будет preg_match_all():

//`sed ...;s/regex/\1/flags` 

$matches_array = array(); 
preg_match_all('/regex/flags', $input, &$matches_array); 

Так что ваш конкретный код будет выглядеть примерно так:

<?php 
$input = file_get_contents('uglynumbers.txt'); 

$input = preg_replace('/[, ]/m','', $input); 

$matches = array(); 
//No need for the .* or groupings, just match all occurrences of [0-9]{9} 
if(preg_match_all('/[0-9]{9}/m', $input, $matches)) 
{ 
    //... 
    var_dump($matches); 
} 

Похоже g является модификатор SED означает соответствие всех строк. preg_match_all() должен уже позаботиться об этом модификаторе, но m кажется подходящей заменой согласно руководству по PCRE modifiers.

+0

У меня есть одна проблема с каждым тестом: Предупреждение: preg_replace() [function.preg-replace]: Неизвестный модификатор 'g' в ... – boogie 2008-10-21 22:25:05

1

Попробуйте использовать preg_replace() вместо preg_match(). grep - sed что preg_match - preg_replace.

2

preg_replace() - это функция, которую вы ищете. Вы можете передать массив шаблонов и заменить параметры

$pattern = array('/[, ]/','/.*\([0-9]\{9\}\).*/'); 
$replace = array('','$1'); 

foreach($lines as $line) { 
    $newlines[] = preg_replace($pattern, $replace, $line); 
} 
+0

В PHP нет модификатора `g`. `preg_replace()` заменяет все по умолчанию и имеет необязательный параметр для ограничения этого. – HamZa 2014-03-02 13:11:56

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