2012-04-10 9 views
2

Beispiel:Wrap ungeöffneter Text in <span>

<div>foo</div> 
<p>bar</p> 
Unwrapped text 

, was ich will:

<div>foo</div> 
<p>bar</p> 
<span>Unwrapped text</span> 

Wie dies erreichen ohne auf neue Linien verlassen?

+0

Zuerst müssen Sie definieren, was Sie mit "wrap" Text meinen. Weil der gesamte Code mindestens mit Tags verpackt werden sollte. Zweitens, was meinst du, ohne auf neue Linien angewiesen zu sein? Dritter und letzter, warum ist das unter PHP/Regex getaggt? Wenn du tatsächlich einen PHP-Code möchtest, kannst du uns bitte zeigen, was du schon versucht hast? –

+1

Der übliche Kommentar für Leute, die HTML mit regulären Ausdrücken analysieren wollen: http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contented-tags/1732454#1732454 – Basti

+0

Kuriositäten was passiert für '

Text

More text
' –

Antwort

2

Ich würde keine regulären Ausdrücke für HTML verwenden.

Sie können es mit phpQuery

$doc = phpQuery::newDocument($html); 
$doc->contents()->not($doc->children())->wrap("<span>"); 
$html = $doc->html(); 

Hat es allerdings nicht versuchen.

1

Extract Token aus dem String wie zum Beispiel: <div>, foo, </div>, <p>, bar, </p>, Unwrapped text. Sie können dies mit regulären Ausdrücken tun. Dann

for each token do 
    if token is opening tag 
     push token on stack 
    else if token is closing tag (and matching opening tag is ontop of stack) 
     pop token from stack 
    else if token is text and stack is not empty 
     ignore token (continue) 
    else if token is text and stack is empty 
     wrap token with <span> 

Dies wird für beliebige verschachtelte XML -Strings arbeiten.