регулярные выражения php

217
29 июля 2017, 06:31

Имеется регулярное выражение:

'~!!(.+?)!!~s'

Замена на:

<red>$1</red>

но дело в том что если текст имеет такую конструкцию

!!\n(перенос строки)привет это текст!!

то текст заменяется правильно, но после тэга <red>(идетноваястрока) а потом уже соответсвенно текст,

так вот вопрос заключается в том, как можно после того как мы изъяли из текста два восклицательных знака, "trim'нуть" его, а потом уже приложить тэг <red> из регулярного вырежния, чтобы внутри тэга <red>(небылоэтогопереноса)привет я текст(издесьтоже)</red>

спасибо

Answer 1

Например так:

$input = "!!\nfoo!!";
$output = preg_replace('~!!\s*(.+?)\s*!!~s', '<red>$1</red>', $input);
var_dump($output); // <red>foo</red>
Answer 2

Раз это не дубликат, предлагаю решать проблему через функцию preg_replace_callback()

<?php
$input = "!!\n\n\n\n\n\n\n\n\n\n\n\nfoo\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n!!";
$output = preg_replace_callback('~!!([^!]+(![^!]+)*)!!~', function($match){
     return '<red>' . trim($match[1]) . '</red>'; 
}, $input);
var_dump($output); // string(14) "<red>foo</red>"

Почему? Потому что такая регулярка

~!!([^!]+(![^!]+)*)!!~

на больших текстах должна отрабатывать быстрее чем регулярка с ленивым захватом символов .*?.

READ ALSO
Два задания с указателями на C++

Два задания с указателями на C++

Посмотрите пожалуйста правильно ли я делаю?

256
Что быстрее: обход вектора или обход списка?

Что быстрее: обход вектора или обход списка?

На собеседовании спросили: что быстрее, обход вектора или обход списка с выводом значений в консоль? Каким образом обходим, не уточнилиЯ ответил,...

252
Cmake собрать проект c++ в windows

Cmake собрать проект c++ в windows

Есть исходный код на c++ Пытаюсь собрать его в Cmake в проект для запуска в VSФайл CMakeLists

246