2012-01-18 3 views
3

Я чувствую себя очень глупо, потому что не способен понять это, но я просто не могу это понять. Мне нужно заменить строку регулярных выражений на шаблон, я нашел два примера этого, но они честно оставили меня более смущенным, чем когда-либо.Как заменить шаблон регулярного выражения на шаблон регулярного выражения?

Это моя текущая попытка:

$string = '26 14:46:54",,"2011-08-26 14:47:02",8,0,"BUSY","DOCUMENTATION","1314370014.18","","","61399130249","7466455647","from-internal","""Oh Snap"" <61399130249>","SIP/1037-00000014","SIP/CL-00000015","Dial","SIP/CL/61436523277,45","2011-08-26 14:47:06","2011-08-26 14:47:15","2011-08-26 '; 
$pattern = '["SIP/CL/\d*?,\d*?",]'; 
$replacement = '"SIP/CL/\1|\2",'; 
$string = preg_replace($pattern, $replacement, $string); 
print($string); 

Но это просто заменяет \1 и \2 с пробелами. Поэтому, очевидно, я не понимаю всю концепцию.

То, что я хотел в конце концов изменить:

this: "SIP/CL/61436523277,45" 
to: "SIP/CL/61436523277|45" 

что запятая в плохо отформатированный CSV скидывает некоторые из моих других сценариев.

+1

Это не похоже, плохо отформатирован, как это в кавычки ... вы используете [ 'fgetcsv'] (http://www.php.net/fgetcsv) для этого, не так ли? Или ['str_getcsv'] (http://www.php.net/str_getcsv), если это строка. – Wrikken

+0

Я не был, но теперь я. Мне все равно нужно было изучить эту форму замены регулярных выражений. Так убили двух зайцев одним выстрелом :). Я знал о fgetcsv, но это не устраивало моих целей (его 1.8GB + csv ...., не могу загрузить все это в память), но str_getcsv работал хорошо! :) – Mattisdada

+0

ОК, для справок в будущем: 'fgetcsv' не читает полный файл в памяти, просто по строкам;) – Wrikken

ответ

2

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

$pattern = '["SIP/CL/(\d*),(\d*)",]'; 
+0

Так оно и было? Я чувствую себя такой фью ».Большое вам спасибо :) Это сработало отлично. – Mattisdada

+0

вы изменили значение оператора non-gready за пределами скобки. Это будет (\ d +?) – meouw

+0

@ user1130968, отмечающий самый полезный ответ, поскольку ответ - лучший способ сказать спасибо здесь.) (Так часто говорится) – Vyktor

2

Я думаю, что вам это нужно:

$pattern = '["SIP/CL/(\d+),(\d+)",]'; 

В круглые скобки - () - захватить матч внутри, что позволяет ссылайтесь на нее в своем шаблоне замены.

Вы также могли бы упростить шаблон замены путем расширения захватов в шаблоне поиска:

$pattern = '[("SIP/CL/\d+),(\d+",)]'; 
$replacement = '\1|\2'; 
2

В обратные_связи \1 и \2 в вашем $replacement предназначены для обозначения захваченных групп в $pattern. Захваченные группы сохраняются путем размещения скобок вокруг них ().

Try (я изменил ваше регулярное выражение разделителей [] в ! в ожидании ответа от комментариев ниже):

$pattern = '!"SIP/CL/(\d*?),(\d*?)",!'; 
$replacement = '"SIP/CL/\1|\2",'; 

также отметить, что, поскольку у вас есть Запятая на вашем $pattern, если ваш $string закончился "SIP/CL/61436523277,45" что бы не преобразуются. Я бы рекомендовал удалить эту запятую.

Также ваше текущее регулярное выражение преобразует "SIP/CL/," в "SIP/CL/|". Если это не ваше намерение, измените * после \d (то есть 0 или больше совпадений) на + (одно или несколько совпадений).

+0

[и] будут восприниматься как разделители в этом случае, а не для класса символов – meouw

+0

не будет шаблоном 1 быть SIP/CL/{numbershere} Так что вы хотите '' "SIP/CL/(\ d *?), (\ d *?) ", 'или ваша первая ссылка смешна. Как в вашей замене будет «SIP/CL/SIP/CL/numbershere | numbersagain' – Michael

+0

@meouw, я забыл об этом, ура. но тогда это не должно быть '' и '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' –

0

Я сделал это

$string = '26 14:46:54",,"2011-08-26 14:47:02",8,0,"BUSY","DOCUMENTATION","1314370014.18","","","61399130249","7466455647","from-internal","""Oh Snap"" <61399130249>","SIP/1037-00000014","SIP/CL-00000015","Dial","SIP/CL/61436523277,45","2011-08-26 14:47:06","2011-08-26 14:47:15","2011-08-26 '; 
$pattern = '/SIP\/CL\/([0-9]+),([0-9]+)/'; 
$replacement = 'SIP/CL/\1|\2'; 
$string = preg_replace($pattern, $replacement, $string); 
print($string); 
Смежные вопросы