2016-06-19 19 views
0

i preg_split("/\"[^\"]*\"(*SKIP)(*F)|\x20/", $input_line); bin mit und führen Sie es auf phpliveregex.com es Array erzeugen:PHP preg_split auf Räume, aber nicht innerhalb von Tags

array(10 
    0=><b>test</b> 
    1=>or 
    2=><em>oh 
    3=>yeah</em> 
    4=>and 
    5=><i> 
    6=>oh 
    7=>yeah 
    8=></i> 
    9=>"ye we 'hold' it" 
) 

nicht das, was ich will, sollte es nur wie diese außerhalb HTML-Tags durch Leerzeichen getrennte sein :

array(5 
    0=><b>test</b> 
    1=>or 
    2=><em>oh yeah</em> 
    3=>and 
    4=><i>oh yeah</i> 
    5=>"ye we 'hold' it" 
) 

in diesem regex ich nur kann Ausnahme in „Anführungszeichen“ hinzufügen, aber wirklich Hilfe benötigen mehr zu schreiben, Tag <img/><a></a><pre></pre><code></code><strong></strong><b></b><em></em><i></i>

jede Erklärung darüber, wie diese Regex funktioniert auch zu schätzen wissen.

+0

Nur 'verwenden <' and '>': 'preg_split ("/ <[^<]*> (* SKIP) (* F) | /", $ input_line);' –

+2

Verwenden Sie DOMDocument und DOMXPath. –

Antwort

1

Es ist einfacher, die DOMDocument zu verwenden, da Sie nicht beschreiben müssen, was ein HTML-Tag ist und wie es aussieht. Sie müssen nur den nodeType überprüfen. Wenn es ein textNode ist, teilen Sie es mit preg_match_all(es ist handlicher als ein Muster zu entwerfen für preg_split):

$html = 'spaces in a text node <b>test</b> or <em>oh yeah</em> and <i>oh yeah</i> 
"ye we \'hold\' it" 
"unclosed double quotes at the end'; 

$dom = new DOMDocument; 
$dom->loadHTML('<div>' . $html . '</div>', LIBXML_HTML_NOIMPLIED); 

$nodeList = $dom->documentElement->childNodes; 

$results = []; 

foreach ($nodeList as $childNode) { 
    if ($childNode->nodeType == XML_TEXT_NODE && 
     preg_match_all('~[^\s"]+|"[^"]*"?~', $childNode->nodeValue, $m)) 
     $results = array_merge($results, $m[0]); 
    else 
     $results[] = $dom->saveHTML($childNode); 
} 

print_r($results); 

Hinweis: Ich habe eine Standardverhalten gewählt haben, wenn ein doppeltes Anführungszeichen Teil unclosed bleibt (ohne Schlusszitat), fühlen Sie sich frei, es zu ändern.

Hinweis2: Manchmal sind LIBXML_ Konstanten nicht definiert. Sie können dieses Problem lösen, ist es vor dem Test und definieren sie bei Bedarf:

if (!defined('LIBXML_HTML_NOIMPLIED')) 
    define('LIBXML_HTML_NOIMPLIED', 8192); 
+0

finaly was ich brauche, danke um meine Tage zu retten @Casimir –

+0

oh, ich brauche Hilfe, dieser Code läuft perfekt in 'localhost', aber nach dem Umzug zum Server hat es Probleme mit dom bekommen. 'Warnung: DOMDocument :: loadHTML() erwartet, dass Parameter 2 lang ist, String in/home/u74' gegeben –

+0

@ Al-Jazary: in einigen Konfig sind die' LIBXML _... 'Konstanten nicht definiert (deshalb bekomme diese Nachricht). Testen Sie in diesem Fall, ob diese Konstante vor dem Skript mit 'defined ('constantName') 'existiert und wenn sie' false 'zurückgibt, definieren Sie sie mit' define (...) '. 'LIBXML_HTML_NOIMPLIED 'Wert ist 8192. –

0

Beschreibung

Statt einen geteilten Befehl nur die Abschnitte der Verwendung passen Sie

<(?:(?:img)(?=[\s>\/])(?:[^>=]|=(?:'[^']*'|"[^"]*"|[^'"\s>]*))*\s?\/?>|(a|span|pre|code|strong|b|em|i)(?=[\s>\\])(?:[^>=]|=(?:'[^']*'|"[^"]*"|[^'"\s>]*))*\s?\/?>.*?<\/\1>)|(?:"[^"]*"|[^"<]*)*

Regular expression visualization

Beispiel

Live Demo

01 wollen

https://regex101.com/r/bK8iL3/1

Beispieltext

Hinweis der schwierigen Rand Fall im zweiten Absatz

<b>test</b> or <strong> this </strong><em> oh yeah </em> and <i>oh yeah</i> Here we are "ye we 'hold' it" 

some<img/>gfsf<a html="droids.html" onmouseover=' var x=" Not the droid I am looking for " ; '>droides</a><pre></pre><code></code><strong></strong><b></b><em></em><i></i> 

Probe

MATCH 1 
0. [0-11] `<b>test</b>` 

MATCH 2 
0. [11-15] ` or ` 

MATCH 3 
0. [15-38] `<strong> this </strong>` 

MATCH 4 
0. [38-56] `<em> oh yeah </em>` 

MATCH 5 
0. [56-61] ` and ` 

MATCH 6 
0. [61-75] `<i>oh yeah</i>` 

MATCH 7 
0. [75-111] ` Here we are "ye we 'hold' it" some` 

MATCH 8 
0. [111-117] `<img/>` 

MATCH 9 
0. [117-121] `gfsf` 

MATCH 10 
0. [121-213] `<a html="droids.html" onmouseover=' var x=" Not the droid I am looking for " ; '>droides</a>` 

MATCH 11 
0. [213-224] `<pre></pre>` 

MATCH 12 
0. [224-237] `<code></code>` 

MATCH 13 
0. [237-254] `<strong></strong>` 

MATCH 14 
0. [254-261] `<b></b>` 

MATCH 15 
0. [261-270] `<em></em>` 

MATCH 16 
0. [270-277] `<i></i>` 

Erklärung Spiele