2016-01-13 3 views
0

Нужно регулярное выражение для замены всех внутренних кронштейнов с помощью myReplace! Важно сохранить пробелы и линии, как есть!Как заменить несколько строк на одной строке или нет в одной строке с PHP?

$fileContent = <div class="panel-body"> 
    {toChangeOne}{toChangeTwo} 
          { 
        toChangeTree 
        } 
</div> 

$change = preg_replace('NEEDED_REGEX', 'myReplace', $fileContent); 
+0

И что вы хотите сделать сейчас? Я знаю только, что вы хотите что-то заменить. что ты уже испробовал? –

+0

Вы также хотите заменить фактические фигурные скобки? Или оставить фигурные скобки и заменить текст? – Quixrick

+0

Да также замените фигурные скобки – Olympus

ответ

2

Хорошо, так что в основном все, что вам будет нужно сделать, это искать фигурные скобки и заменить это, плюс все, что внутри него.

Что-то, как это должно работать для вас:

<?php 

$fileContent = '<div class="panel-body"> 
    {toChangeOne}{toChangeTwo} 
          { 
        toChangeTree 
        } 
</div>'; 

$fileContent = preg_replace('~\{.*?\}~sm', 'myReplace', $fileContent); 

print $fileContent;  

Вот что значит, что выражение \{.*?\}:

  • \{ - Глядя на открывающей фигурной скобки {. Нам нужно сбежать с обратной косой чертой \, поскольку фигурные скобки имеют особое значение в регулярном выражении.
  • .*? - Сопоставьте любые символы ., любое количество раз *, пока не попали в следующую часть нашего заявления ?.
  • \} - Следующая часть нашего заявления - закрывающая фигурная скобка }. Опять же, нам нужно сбежать с обратной косой чертой \.

Вот рабочий пример:

http://ideone.com/Pi8OvI

+0

Да, это .. Последний вопрос! если у меня есть {toChange {something} One}, я хочу сохранить {something} как есть – Olympus

+0

Ну, это скорее вызов. Вы можете сделать это несколькими способами, но это будет сложнее. Во-первых, вы можете сделать выражение жадным, удалив знак вопроса. '\ {. * \}', но это будет соответствовать всем в вашем скрипте с первой фигурной скобки до последней фигурной скобки. Если они находятся на отдельных строках, вы можете удалить флаги 'sm' в конце, чтобы они не охватывали несколько строк, и это может сработать. Другим методом является использование 'preg_replace_callback' для оценки каждого соответствия и проверки наличия открытой фигурной скобки в середине вашего совпадения. Пропустите его, если он найдет совпадение. – Quixrick

+0

Можете ли вы сделать preg_replace_callback? – Olympus

1

Можно также подойти к вашей проблеме, используя массив ключей для изменения, как показано ниже. Это может быть полезно при попытке заменить несколько строк.

<?php 

// array with keys that you'll be changing in your text 
$toChange = array(
"{toChangeOne}" => "First Change", 
"{toChangeTwo}" => "Second Change", 
"{toChangeThree}" => "Third Change" 
); 


$fileContent = '<div class="panel-body"> 
    {toChangeOne}{toChangeTwo} 
          { 
        toChangeThree 
        } 
</div>'; 

// loop through all the keys you want to change 
foreach($toChange as $key => $value){ 

    // prep regex 
    // remove the openning and curly braces this 
    // way we can match anything that matches our 
    // keys even if there's a mixture of returns 
    // or empty spaces within the curly braces 
    $key_text = str_replace("{", "", $key); 
    $key_text = str_replace("}", "", $key_text); 

    // "\{"    - matches the character "{" literally 
    // "(\s|\s+)?"  - matches any white space. In our case 
    //     we might want it to be optional hense 
    //     the "?" 
    // "\}"    - matches the character "}" literally 
    $regex = '/\{(\s|\s+)?'.$key_text.'(\s|\s+)?\}/'; 

    $fileContent = preg_replace($regex, $value, $fileContent); 
} 

echo $fileContent; 
+0

Тогда вы очень хорошо! – Olympus

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