Преобразование строки sed в PHP - PullRequest
4 голосов
/ 22 октября 2008

У меня есть регулярное выражение, которое я использую с 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];
}

Ответы [ 3 ]

2 голосов
/ 22 октября 2008

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

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

foreach($lines as $line) {
   $newlines[] = preg_replace($pattern, $replace, $line);
}
2 голосов
/ 22 октября 2008

Ваш конкретный пример 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 модификаторам .

2 голосов
/ 22 октября 2008

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

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