2013-09-20 5 views
0

Любых идей, что может быть не так с этим регулярным выражением - это, кажется, не найти ничего:Regex шаблон для сложного HTML DIV

function ad_content($content) { 
    if (is_single()) { 
    $find = '#<div id=\"attachment_(\d+)\" class=\"wp-caption aligncenter\" style=\"width: (\d+)px\">(.*?)</div>#s'; 
    $replace1 = '11111'; 
    $content = preg_replace($find,$replace,$content,1); 
    } 
    return $content; 
} 
add_filter ('the_content','ad_content'); 

Я пытался что-то вроде основного

$find = '#attachment#'; 

и это действительно работает.

Когда я использую указанное выше регулярное выражение, оно ничего не заменяет и не дает никаких ошибок. Таким образом, я полагаю, он ничего не нашел. Вот что он должен найти:

<div id="attachment_167" class="wp-caption aligncenter" style="width: 600px"><a href="http://www.url.com"><img class="size-full wp-image-167" alt="text" src="http://www.url.com" width="600" height="776" /></a><p class="wp-caption-text">text &#8211; text</p></div> 

Я пробовал его на this regex validator и это делает матч.

ОТВЕТ:

Я думаю, что я, наконец, понял это - the_content крюк, кажется, не относится к моим делам. Просто как тот.

+4

Что не используется парсер DOM для этого? Это было бы предпочтительным методом. –

+7

http://stackoverflow.com/a/1732454/1253312 –

+0

Потому что я понятия не имею, что это такое. Я ЭТО НУЖНО. Вы были бы любезны пролить свет? – kat

ответ

1

Ваше регулярное выражение выглядит правильно для меня.

Когда я меняю $replace1 на $replace, соглашайтесь с использованием позже в функции и удалите оператор if, похоже, сработает. То есть:

function ad_content($content) { 
    $find = '#<div id=\"attachment_(\d+)\" class=\"wp-caption aligncenter\" style=\"width: (\d+)px\">(.*?)</div>#s'; 
    $replace = '11111'; 
    $content = preg_replace($find,$replace,$content,1); 
    return $content; 
} 

Казалось бы, работа по назначению. Я предполагаю, что проблема $replace1 по сравнению с , вероятно, не в коде вашего исполнения (поскольку вы не обнаруживаете ошибок), вы уверены, что is_single() возвращает true в контексте, в котором вы это тестируете?

+0

Yup. $ find = '# attachment #'; работает. PS. Вы правы на $ replace1 - просто опечатка. Я даже упростил это до: $ find = '#

#s'; – kat

0

Вы должны использовать domparser, чтобы получить содержимое «правильного» div.

себе представить, что будет с «DIV» внутри или DIV iteself могут быть вложенными:

<div> 
    Something else 
     <div id="thisIwantToMatch"> Foo <div>Bar</div> Baz </div> 
    Again something else 
    </div> 

Поскольку End-Tag не содержит атрибутов, это трудно - bareley невозможно - найти правильный используя регулярное выражение. Использование «ленивого» регулярного выражения будет соответствовать <div id="thisIwantToMatch"> Foo <div>Bar</div>, в то время как жадное регулярное выражение будет соответствовать <div id="thisIwantToMatch"> Foo <div>Bar</div> Baz </div>Again something else</div>

Очевидно, что оба случая не то, что вы хотите.

+0

Мне бы хотелось, чтобы это соответствовало ... или чему-то еще! Мой HTML очень прост, поэтому он не будет иметь вложенных div и т. Д. Реальная проблема в том, почему она вообще не соответствует? Я даже упростил это до: $ find = '#

#s'; Еще нет совпадений. – kat

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