шаблон preg_replace для php - PullRequest
       1

шаблон preg_replace для php

0 голосов
/ 07 июля 2011

У меня есть некоторые проблемы с моими паттернами.Надеюсь, кто-нибудь может мне помочь с этим.

с заданной строкой

$string = Mutualism has been retrospectively characterised as ideologically situated between individualist and collectivist forms of anarchism.<ref>Avrich, Paul. ''Anarchist Voices: An Oral History of Anarchism in America'', Princeton University Press 1996 ISBN 0-691-04494-5, p.6<br />''Blackwell Encyclopaedia of Political Thought'', Blackwell Publishing 1991 ISBN 0-631-17944-5, p. 11.</ref> Proudhon first characterised his goal as a "third form of society, the synthesis of communism and property."<ref>Pierre-Joseph Proudhon. ''What Is Property?'' Princeton, MA: Benjamin R. Tucker, 1876. p. 281.</ref> Another is <ref name=rupert/>

Я хочу удалить строки внутри &lt;ref&gt; (<ref name='something'></ref> or <ref></ref>) or remove the single ref tag <ref name='sss' />

после замены окончательного выходного значения должно быть:

Мутуализм ретроспективно охарактеризован как идеологически расположенный между индивидуалистической и коллективистской формами анархизма.Прудон впервые охарактеризовал свою цель как «третью форму общества, синтез коммунизма и собственности».Другой -

мой код, кажется, не работает

$pattern1[] = "/&lt;ref[^\/]*\/&gt;/is"; //remove <ref name=something/>  
$pattern1[] = "/&lt;ref[^\/]*&gt;(.*?)&lt;\/ref&gt;/s";  //remove ref <ref>some text here</ref>
preg_replace($pattern1,"\n", $string);

, вместо этого он выдает:

Мутуализм был ретроспективно охарактеризован как идеологически расположенный междуиндивидуалистические и коллективистские формы анархизма.«Энциклопедия политической мысли Блэквелла», Blackwell Publishing 1991 ISBN 0-631-17944-5, p.11. Прудон впервые охарактеризовал свою цель как «третью форму общества, синтез коммунизма и собственности».Другой -

Я думаю, он догнал &lt;br /&gt;

Ответы [ 4 ]

1 голос
/ 07 июля 2011

не самый эффективный, но очень простой

$text=strip_tags(str_replace(array('&lt;','&gt;'),array('<','>'),$text));

strip_tags

0 голосов
/ 07 июля 2011

Не рекомендуется анализировать HTML с помощью регулярных выражений, но для этого простого случая вы можете сделать:

<?php
preg_replace('/<ref.*?\/>|<ref>.*?<\/ref>/', '', $string);
0 голосов
/ 07 июля 2011

Я заключил вашу оригинальную строку в двойные кавычки:

$string = "Mutualism has been retrospectively characterised as ideologically situated between individualist and collectivist forms of anarchism.&lt;ref&gt;Avrich, Paul. ''Anarchist Voices: An Oral History of Anarchism in America'', Princeton University Press 1996 ISBN 0-691-04494-5, p.6&lt;br /&gt;''Blackwell Encyclopaedia of Political Thought'', Blackwell Publishing 1991 ISBN 0-631-17944-5, p. 11.&lt;/ref&gt; Proudhon first characterised his goal as a &quot;third form of society, the synthesis of communism and property.&quot;&lt;ref&gt;Pierre-Joseph Proudhon. ''What Is Property?'' Princeton, MA: Benjamin R. Tucker, 1876. p. 281.&lt;/ref&gt; Another is &lt;ref name=rupert/&gt;";

$pattern = '#&lt;ref.*?&gt;(.*?&lt;/ref&gt;)?#is';

print htmlspecialchars_decode(preg_replace($pattern, '', $string));

htmlspecialchars_decode требуется для преобразования &quot в двойные кавычки - пропустите это, если вы выводите на устройство, которое делает это за вас, такое как браузер.

Выход:

Мутуализм был ретроспективно характеризуется как идеологически расположенный между индивидуалистом и Коллективистские формы анархизма. Прудон первым охарактеризовал свою цель как «третья форма общества, синтез коммунизма и собственности ". Еще один

Примечания:

Я поменял местами обычный / разделитель на #, что означает, что / можно использовать внутри шаблона без его выхода.

.* по умолчанию жадный. Добавление модификатора ? в шаблон делает это несправедливым, что эквивалентно добавлению модификатора шаблона U .

.

&lt;ref.*?&gt; соответствует &lt;ref, за которым следует что-либо до следующего &gt;.

.*? соответствует чему-либо до следующего &lt;/ref&gt;

Обтекание .*?&lt;/ref&gt; в ()? означает, что нужно найти ноль или одно вхождение. Это подходит для ситуаций, когда есть открывающий и закрывающий теги, и где есть открывающий тег без содержимого после него.

Если вы также хотите сопоставить открывающий тег с содержимым, следующим за ним, но без закрывающего тега, вы можете изменить шаблон следующим образом:

$pattern = '#&lt;ref.*?&gt;(.*?&lt;/ref&gt;|.*)#is';
0 голосов
/ 07 июля 2011

Проблема в том, что ваш первый шаблон также соответствует

Аврич, Пол.«Голоса анархистов: устная история анархизма в Америке», издательство Принстонского университета, 1996, ISBN 0-691-04494-5, с.6

[^\/]* соответствует следующему

> Avrich, Paul.«Голоса анархистов: устная история анархизма в Америке», издательство Принстонского университета, 1996, ISBN 0-691-04494-5, с.6В качестве второй опции здесь символ (?!gt;) является отрицательным прогнозным прогнозом (см. http://www.php.net/manual/en/regexp.reference.assertions.php), это просто означает, что без использования gt; убедитесь, что следующие 3 символа не соответствуют этому шаблону.

Второй просто соответствует любому символу, который не является /.

, поэтому следующий код

$str = "Mutualism has been retrospectively characterised as ideologically situated between individualist and collectivist forms of anarchism.&lt;ref&gt;Avrich, Paul. ''Anarchist Voices: An Oral History of Anarchism in America'', Princeton University Press 1996 ISBN 0-691-04494-5, p.6&lt;br /&gt;''Blackwell Encyclopaedia of Political Thought'', Blackwell Publishing 1991 ISBN 0-631-17944-5, p. 11.&lt;/ref&gt; Proudhon first characterised his goal as a &quot;third form of society, the synthesis of communism and property.&quot;&lt;ref&gt;Pierre-Joseph Proudhon. ''What Is Property?'' Princeton, MA: Benjamin R. Tucker, 1876. p. 281.&lt;/ref&gt; Another is &lt;ref name=rupert/&gt;";
$match = array(
    "/&lt;ref(?:[^\/&]|&(?!gt;))*\/&gt;/is",
    "/&lt;ref[^\/]*&gt;(.*?)&lt;\/ref&gt;/s",);
$str = preg_replace($match,'',$str);
echo $str;

выводит

Мутуализм ретроспективно охарактеризован как идеологически расположенныймежду индивидуалистической и коллективистской формами анархизма. Прудон впервые охарактеризовал свою цель как «третью форму общества, синтез коммунизма и собственности». Другой является

...