Wyrażenie regularne zaznacza cały tekst pomiędzy znacznikami

Jaki jest najlepszy sposób na zaznaczenie całego tekstu pomiędzy znacznikami 2-ex: tekst pomiędzy wszystkimi znacznikami " pre " na stronie.

Author: user990423, 2011-08-24

13 answers

Możesz użyć "<pre>(.*?)</pre>", (zastępując pre dowolnym tekstem) i wyodrębnić pierwszą grupę (dla bardziej szczegółowych instrukcji określ język), ale zakłada to uproszczone przekonanie, że masz bardzo prosty i poprawny HTML.

Jak sugerowali inni komentatorzy, jeśli robisz coś skomplikowanego, użyj parsera HTML.

 111
Author: PyKing,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-23 21:00:44

Znacznik może być uzupełniony w innej linii. Dlatego należy dodać \n.

<PRE>(.|\n)*?<\/PRE>
 99
Author: zac,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-17 11:21:27

Tego bym użył.

(?<=(<pre>))(\w|\d|\n|[().,\-:;@#$%^&*\[\]"'+–/\/®°⁰!?{}|`~]| )+?(?=(</pre>))

W Zasadzie to co robi to:

(?<=(<pre>)) selekcja musi być poprzedzona znacznikiem <pre>

(\w|\d|\n|[().,\-:;@#$%^&*\[\]"'+–/\/®°⁰!?{}|~]| ) to tylko wyrażenie regularne, które chcę zastosować. W tym przypadku wybiera literę, cyfrę lub znak nowej linii lub niektóre znaki specjalne wymienione w przykładzie w nawiasach kwadratowych. Znak rury | oznacza po prostu " lub ".

+? Stany znaków Plus, aby wybrać jedną lub więcej z powyższych - porządek nie ma znaczenia. znak zapytania zmienia domyślne zachowanie z 'greedy' na 'ungreedy'.

(?=(</pre>)) wybór musi być dołączony przez znacznik <pre>

Tutaj wpisz opis obrazka

W zależności od przypadku użycia może być konieczne dodanie modyfikatorów, takich jak (i lub m )

  • i - case-niewrażliwe
  • m - wyszukiwanie wieloliniowe

Tutaj wykonałem to wyszukiwanie w wysublimowanym tekście, więc nie muszę użyć modyfikatorów w moim regex.

Javascript nie obsługuje lookbehind

Powyższy przykład powinien działać dobrze z językami takimi jak PHP, Perl, Java ... Javascript jednak nie obsługuje lookbehind, więc musimy zapomnieć o używaniu (?<=(<pre>)) i szukać jakiegoś obejścia. Być może proste usunięcie pierwszych czterech znaków z naszego wyniku dla każdej selekcji, jak tutaj regex dopasuj tekst między znacznikami

Zobacz też JavaScript REGEX DOCUMENTATION for non-capture nawiases

 10
Author: DevWL,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-31 16:40:51

Użyj poniższego wzorca, aby pobrać zawartość między elementami. Zastąp znacznik [tag] rzeczywistym elementem, z którego chcesz wyodrębnić zawartość.

<[tag]>(.+?)</[tag]>

Czasami znaczniki będą miały atrybuty, takie jak anchor znacznik mający href, Następnie użyj poniższego wzorca.

 <[tag][^>]*>(.+?)</[tag]>
 7
Author: Shravan Ramamurthy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-20 15:56:43

Nie powinieneś próbować parsować html z wyrażeniami regularnymi Zobacz to pytanie i jak to się skończyło.

Mówiąc najprościej, html nie jest językiem regularnym, więc nie można w pełni analizować go za pomocą wyrażeń regularnych.

Powiedziawszy, że możesz analizować podzbiory html, gdy nie ma podobnych tagów zagnieżdżonych. Tak długo, jak cokolwiek pomiędzy i nie jest samym tagiem, to będzie działać:

preg_match("/<([\w]+)[^>]*>(.*?)<\/\1>/", $subject, $matches);
$matches = array ( [0] => full matched string [1] => tag name [2] => tag content )

Lepszym pomysłem jest użycie parsera, takiego jak natywny DOMDocument, do załadowania twojego html, następnie wybierz swój tag i uzyskaj wewnętrzny html, który może wyglądać mniej więcej tak:

$obj = new DOMDocument();
$obj -> load($html);
$obj -> getElementByTagName('el');
$value = $obj -> nodeValue();

A ponieważ jest to odpowiedni parser, będzie w stanie obsłużyć znaczniki zagnieżdżania itp.

 6
Author: sg3s,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:29

Spróbuj tego....

(?<=\<any_tag\>)(\s*.*\s*)(?=\<\/any_tag\>)
 3
Author: Heriberto Rivera,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-23 18:31:58

var str = "Lorem ipsum <pre>text 1</pre> Lorem ipsum <pre>text 2</pre>";
    str.replace(/<pre>(.*?)<\/pre>/g, function(match, g1) { console.log(g1); });

Ponieważ akceptowana odpowiedź jest bez kodu javascript, więc dodając, że:

 1
Author: Shishir Arora,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-28 01:41:51

Aby wykluczyć znaczniki rozgraniczające:

"(?<=<pre>)(.*?)(?=</pre>)"
 1
Author: Jean-Simon Collard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-04 19:31:13

Dla wielu linii:

<htmltag>(.+)((\s)+(.+))+</htmltag>
 0
Author: Dilip,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-16 22:18:11

Możesz użyć Pattern pattern = Pattern.compile( "[^<'tagname'/>]" );

 0
Author: Ambrish Rajput,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-17 15:10:32

Używam tego rozwiązania:

preg_match_all( '/<((?!<)(.|\n))*?\>/si',  $content, $new);
var_dump($new);
 0
Author: T.Todua,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-29 14:50:08

To wydaje się być najprostszym wyrażeniem regularnym ze wszystkich, które znalazłem

(?:<TAG>)([\s\S]*)(?:<\/TAG>)
  1. Wyklucz znacznik otwarcia (?:<TAG>) z meczów
  2. dodawanie dowolnych znaków spacji lub innych znaków ([\s\S]*) w dopasowaniach
  3. Wyklucz tag zamknięcia (?:<\/TAG>) z meczów
 0
Author: maqduni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-30 09:19:02
<pre>([\r\n\s]*(?!<\w+.*[\/]*>).*[\r\n\s]*|\s*[\r\n\s]*)<code\s+(?:class="(\w+|\w+\s*.+)")>(((?!<\/code>)[\s\S])*)<\/code>[\r\n\s]*((?!<\w+.*[\/]*>).*|\s*)[\r\n\s]*<\/pre>
 -3
Author: user5988518,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-26 23:04:04