2016-03-30 4 views
-1

Я создаю короткий код с помощью preg_replace.Preg_replace с кронштейнами [] внутри

$content = preg_replace(
    '%\[social-lock]([^[]*)\[/social-lock]%', 
    $html_str_1. '\1' . $html_str_2 . '<br/>' . $html_js, 
    $content 
    ); 
echo $content; 

Когда я применяю этот шорткод к содержимому HTML, мы будем иметь что-то подобное

Below content will be hidden. 

[social-lock] 
Code Vip: Write something here. 
[/social-lock]. 

Выход в браузер будет показывать:

Below content will be hidden. 
<div class="lock" style="display:none"> 
Code Vip: Write something here. 
</div> 

Но если добавить скобки внутри HTML-контент (между социальным замком), например:

Below content will be hidden. 

[social-lock] 
Code Vip: Write something here. [show the brackets here] 
and it will not be hidden. 
[/social-lock]. 

Содержание внутри [social-lock] - [/ social-lock] должно быть скрыто, но это не так. Я думаю, что из-за скобок [] внутри содержимого короткого кода. Но я не нашел решения.

ответ

2

Это ломается, потому что вы используете это ([^[]*), в котором говорится, что каждый символ кроме [ между 0 и неограниченным временем. Таким образом, он останавливается на [ в вашей строке.

Для решения этой проблемы вы можете использовать (.*?), в котором говорится, что все между 0 и неограниченным временем, но ленивым. Также убедитесь, что установлен флаг s, поэтому . также может соответствовать новым строкам.

+0

Мой код также заменяет '[social-lock]' и помещает внутренний контент в новый div. Я попробовал '(. *?)', Но не повезло. –

+0

@AluminumGates Как я уже сказал, вам также нужно установить флаг 's': https://regex101.com/r/zR1rC5/1 – Rizier123

+0

Ты спас мне жизнь! Я забыл/с. Благодаря ! –

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