2014-02-14 6 views
0

В принципе, мне нужно заменить предупреждение класса css примерно на 3000 документов, потому что он разбивает бутстрап css. Я могу найти весь класс css, выполнив поиск (?<=class=")(.*)(?="), но я не могу просто найти класс предупреждения, используя (?<=class=".*)(alert)(?=.*") или что-нибудь в этом роде.Regex найти определенную строку только между двумя другими конкретными строками

В принципе, данный набор данных:

<div class=" big alert solid">Alert alert</div> 
<div class="alert solid">Alert alert</div> 
<div class=" big solid">Alert alert</div> 

Я только хочу найти текстовое уведомление внутри атрибута класса.

У меня возникло ощущение, что для этого есть рабочее решение, оно будет включать необязательные подстановочные знаки в перспективе вперед/назад. Что-то вроде:

(?<=class="(.)?)(.*)(?=(.)?") 
+3

', потому что он ломает самозагрузки css' почему бы не изменить самозагрузки CSS? И если вы не можете/не хотите, вы должны анализировать эти страницы с помощью собственного DOM-анализатора, не используйте регулярное выражение. – Mark

+0

Я не говорю ни о чем в веб-браузере или с помощью javascript. Я говорю о документах в файловой системе во FreeBSD. – user1119648

+0

Как насчет '(? <= Class =") (. * Alert. *) (? = ")' – MElliott

ответ

0

Вы можете попробовать выражение как это:

(?<=class\s?=\s?")(.*?)alert(.*?)(?=") 

и замена заполнитель будет тогда как

$1$2 

в результате

<div class=" big solid">Alert alert</div> 
<div class=" solid">Alert alert</div> 
<div class=" big solid">Alert alert</div> 
+0

PHP preg '5.3.6-5.3.18' и' 5.4.9-5.4.13' не поддерживает повторение переменных внутри lookbehind. –

0

Регулярного выражения для любой тег, например div, span и p:

(<[A-Z][A-Z0-9]*\b[^>]*\bclass\s*=\s*"(?:|[^"]+))\balert\b((?:|[^"]+)") 

Regular expression visualization

Регулярное выражение для всего div тегов:

(<div\b[^>]*\bclass\s*=\s*"(?:|[^"]+))\balert\b((?:|[^"]+)") 

В качестве замены выбрать одно из следующих действий:

Заменить alert с alternative-alert-class-name:

$1alternative-alert-class-name$2 

Или заменить alert ни с чем:

$1$2 

PHP кода (обратите внимание на использование нечувствительности к регистру):

$result = preg_replace('/(<[A-Z][A-Z0-9]*\b[^>]*\bclass\s*=\s*"(?:|[^"]+))\balert\b((?:|[^"]+)")/imx', '$1alternative-alert-class-name$2', $subject); 

Пример ввода:

<div class="alert">Alert alert</div> 
<div class="alert solid">Alert alert</div> 
<div class = "alert solid">Alert alert</div> 
<div class=" big alert solid">Alert alert</div> 
<div class = " big alert solid">Alert alert</div> 
<div something="xx" class = " big alert solid">Alert alert</div> 
<span enabled something="xx" class = " big alert solid">Alert alert</span> 
<div class=" big solid">Alert alert</div> 

Пример вывода :

<div class="alternative-alert-class-name">Alert alert</div> 
<div class="alternative-alert-class-name solid">Alert alert</div> 
<div class = "alternative-alert-class-name solid">Alert alert</div> 
<div class=" big alternative-alert-class-name solid">Alert alert</div> 
<div class = " big alternative-alert-class-name solid">Alert alert</div> 
<div something="xx" class = " big alternative-alert-class-name solid">Alert alert</div> 
<span enabled something="xx" class = " big alternative-alert-class-name solid">Alert alert</span> 
<div class=" big solid">Alert alert</div> 
0

Вы можете использовать это:

$data = <<<EOD 
<div class=" big alert solid">Alert alert</div> 
<div class = "other-alert-class solid">Alert alert</div> 
<div class=" big solid">Alert alert</div> 
<div class=' big alert solid'>Alert alert</div> 
<div class = alert>Alert alert</div> 
EOD; 

$pattern = '~\sclass\s*=\s*(?>["\'](?>[^"\'a]++|(?<=\B|-)a|a(?!lert\b[^-]))*)?\Kalert\b~'; 

$result = preg_replace($pattern, 'otherclass', $data); 
Смежные вопросы