2013-02-14 2 views
0

Я вижу здесь много вопросов относительно регулярного выражения, но проблема в том, что они обычно (как и мои) довольно локализованы и трудно вычитать, если вы не являетесь экспертом по регулярному выражению ..php - регулярное выражение, заменяющее строки фигурными скобками и котировками

В моей строке присутствуют символы, такие как кавычки и фигурные скобки, которые, как известно, затрудняют создание регулярного выражения.

Мне хотелось бы знать строки выражений (поиск, замена) Мне нужно, чтобы выполнить эту задачу.

другими словами, в:

ereg_replace (string pattern, string replacement, string subject) 

я буду нуждаться в string pattern и string replacement выражения.

моя строка

array('val' => 'something', 'label' => 'someword'), 

мне нужно изменить последнюю часть:

'label' => 'someword'), 

к

'label' => __('someword','anotherstring')), 

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

Обратите внимание, что строка someword также может быть SomeWord или SOMEWORD или даже Some word или Some_Word по делам, то есть он может содержать пробелы, подчеркивания или фактически почти любой символ внутри ...)

Edit I: забыл о том, что часть __() - это, конечно, функция wordpress textdomain для переводов. например __('string','texdomain')

Edit II:

Я извиняюсь, если я отрываться слишком требовательным или требуя в комментариях, я действительно стараюсь ПОНЯТЬ и не только копировать-вставить решение, которое может не работать для я в других случаях .. :-)

Edit III:

при помощи THIS инструмента, я понял, что т Исходное недоразумение - это возможность использовать переменные внутри регулярного выражения. $1 на самом деле все, что мне нужно для лучшего понимания.

(невероятно простой) модель, которая будет работать и в Notepad ++

Pattern: 'label' => ('.*') 

Replace: 'label' => __(\1,'textdomain') 

(В Notepad ++ это называется Tag Region (не вар) и он помечен как \1

+0

Я не могу понять, что именно вы хотите, 'метки' => 'someword'), чтобы 'меткой' => __ ('someword', 'anotherstring'))? – 2013-02-14 06:53:30

+0

@Akam - да .. но часть 'someord' - это неизвестная строка, а не буквально' somord'. это может быть что угодно. Часть 'otherstring', однако, является фиксированной строкой. –

+1

@ObmerkKronen Regex-es не очень гибкие. Для данного ввода и вывода, представленных в вашем вопросе [это] (http://codepad.viper-7.com/dxXTId), вы получите желаемый результат. Шаблон регулярных выражений: '' label '=> ('. * ') 'Если вам нужна только быстрая замена IDE, этого достаточно. – Leri

ответ

1

Если вы всегда будете искать ключ label, вы должно быть в состоянии сделать что-то вроде этого:

$pattern = "/array\((.*), 'label' => '(.*)'/U"; 
$added_string = 'anotherstring'; 
$replacement = 'array($1, ' . "'label' => __('" . '$2' . "','$added_string'"; 
$final_string = preg_replace($pattern, $replacement, $original_string); 
+0

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

+0

целое '$ pattern' показано как регулярное выражение.' $ replacement' не является регулярным выражением, однако он использует обратные ссылки '$ 1' и' $ 2' для захваченных подшаблонов из регулярного выражения. Часть '$ added_string' на замену - это просто переменная, которая содержит другую строку, которая должна быть добавлена. Если это постоянное значение, вы можете так же легко опустить использование переменной здесь. Обратите внимание, что важно не использовать двойные кавычки вокруг области строки, где отмечены обратные ссылки (если вы не хотите использовать синтаксис '\\ 1' для обратной ссылки –

+0

ok, а первый '/' в $ pattern просто экранируется или является частью выражения регулярного выражения? –

0
<?php 
$strings = array('some word', 'some Word', 'SOMEword', 'SOmE_Word', 'sOmE_ WOrd'); 
$pattern = '/([a-z]+)([^a-z]*)([a-z]+)/i'; 
foreach($strings as $v){ 
echo preg_replace($pattern, 'otherword', $v)."<br>"; 
} 
?> 

выход:

otherword 
otherword 
otherword 
otherword 
otherword 

EDIT:

$pattern = "/('label'\s=>\s')(([a-z]+)([^a-z]*)([a-z]+))('\),)/i"; 
$otherword = 'otherword'; 
$replacement = "'label' => __('$2','$otherword')),"; 
echo preg_replace($pattern, $replacement, "'label' => 'someword'),"); 

выход:

'метка' => __ ('someword', 'otherword')),

DEMO

+0

Спасибо за ответ, но я верю, что это приведет только к простой замене, а не к упаковке функции.Кроме того, он не включает в себя всех нарушителей спокойствия, таких как '(' ',' ')' и '=' –

+0

, можете ли вы точно указать список совпадающих слов (шаблонов) со списком замещений? – 2013-02-14 07:11:23

1

для заданных входов и выходов в модели вопроса: 'label' => ('.*') достаточно, чтобы соответствовать строкам и выполнить замену. Этот шаблон соответствует следующей части строки: 'label' =>любой символ между '. Часть рисунка в фигурных скобках будет группировать любой символ между ', к которому позднее можно получить доступ с помощью $1. Например .:

$str = "array('val' => 'something', 'label' => 'some testing string_with\$specialchars\/'),"; 
$str = preg_replace('/\'label\' => (\'.*\')/', '\'label\' => __($1, \'some other string\')', $str); 
echo $str; 
//Outputs: 
// array('val' => 'something', 'label' => __('some testing string_with$specialchars\/', 'some other string')), 
+0

еще раз спасибо - ссылка, которую вы опубликовали http://codepad.viper-7.com/dxXTId, демонстрирует и работает хорошо (пересмотрено для будущих ссылок людьми, которые прочитают этот ответ) –

+0

@ObmerkKronen Добро пожаловать. Я рад, что смогу вам помочь. ;) – Leri

+1

@ см. Мое последнее изменение, на самом деле то, что мне не хватало, было переменной $ 1. –

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