PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit regex und preg_split



nul
18-03-2006, 21:34
Ich versuche gerade eine HTML-Datei um die nach ner regex zu splitten.
Es geht um folgenden Code:

<?php


$test = ' <div align="center">
<h1>
&nbsp;
</h1>
</div>
{SELECT:name:class:table1:field1:Order1}
<table>
<tr>
<td width="15%">
SELECT
</td>
<td width="85%">
{SELECT:name:class:table1:field1:Order1} <input name="change_user" type="submit" value="1" />
</td>
</tr>
</table>
{SELECT:name:class:table1:field1:Order1}';
$regex = "|{SELECT:[a-z0-9A-Z]+:[a-z0-9A-Z]+:[a-z,0-9A-Z]+:[a-z,0-9A-Z]*:[a-z,0-9A-Z]*}|";

$result = array();

$result = preg_split( $regex, $test, PREG_SPLIT_OFFSET_CAPTURE );
?>
Ich mochte den String $test so splitten, dass alle Teile sowie die Trennelemente im Array $result landen.

Jemand eine Idee?

Romanday
19-03-2006, 00:00
Ich versuche gerade eine HTML-Datei um die nach ner regex zu splitten.
Es geht um folgenden Code:

<?php


$test = ' <div align="center">
<h1>
&nbsp;
</h1>
</div>
{SELECT:name:class:table1:field1:Order1}
<table>
<tr>
<td width="15%">
SELECT
</td>
<td width="85%">
{SELECT:name:class:table1:field1:Order1} <input name="change_user" type="submit" value="1" />
</td>
</tr>
</table>
{SELECT:name:class:table1:field1:Order1}';
$regex = "|{SELECT:[a-z0-9A-Z]+:[a-z0-9A-Z]+:[a-z,0-9A-Z]+:[a-z,0-9A-Z]*:[a-z,0-9A-Z]*}|";

$result = array();

$result = preg_split( $regex, $test, PREG_SPLIT_OFFSET_CAPTURE );
?>
Ich mochte den String $test so splitten, dass alle Teile sowie die Trennelemente im Array $result landen.

Jemand eine Idee?


Mach des doch in 2 Schritten.
1.) alle {} raushohlen
2.) optional kannst du dann den String immer noch nach : teilen.

Ist auch wartungsfreundlicher wenn sich die Syntax mal ändert, oder
erweitert wird.

nul
19-03-2006, 01:05
Hast recht, ich hab aber ziemlich lang gebraucht bis ich den String dann korrekt zusammengesetzt hatte.
Auf jedenfall funktioniert das jetzt und schaut so aus:

<?php
function splitForSelect( $content ) {
$content = trim( $content );
$regex = '|{SELECT:[a-z0-9A-Z]+:[a-z0-9A-Z]+:[a-z0-9A-Z]+:[a-z,0-9A-Z]+:[a-z,0-9A-Z]*:[a-z,0-9A-Z]*}|';

$numberOfPatterns = preg_match_all( $regex, $content, $resultWithPattern, PREG_OFFSET_CAPTURE );

$patterns = array();
$pattstart = array();

for ( $i = 0; $i < $numberOfPatterns; $i++ ) {
$patterns[$i] = $resultWithPattern[0][$i][0];
$pattstart[$i] = $resultWithPattern[0][$i][1];
}

return buildContent( $patterns, $pattstart, $content );
}

function getSelectForPattern( $pattern ) {
return $pattern;
}

function buildContent( $patterns, $positions, $content ) {
$con = '';
$indexCounter = 0;
$iteratorPosition = 0;
$iteratorMaxPosition = strlen( $content );

while ( $iteratorPosition < $iteratorMaxPosition ) {
if ( $iteratorPosition == $positions[$indexCounter] ) {
$iteratorPosition += strlen( $patterns[$indexCounter] ) - 1;
$con .= getSelectForPattern( $patterns[$indexCounter] );
$indexCounter++;
} else {
$con .= $content[$iteratorPosition];
}
$iteratorPosition++;
}
return $con;
}

$test = '{SELECT:name0:class:value:table1:field1:Order1} <div align="center">
<h1>
&nbsp;
</h1>
</div>
{SELECT:name1:class:value:table1:field1:Order1}
<table>
<tr>
<td width="15%">
SELECT
</td>
<td width="85%">
{SELECT:name2:class:value:table1:field1:Order1} <input name="change_user" type="submit" value="1" />
</td>
</tr>
</table>
{SELECT:name3:class:value:table1:field1:Order1}{SE LECT:name4:class:value:table1:field1:Order1}';

echo splitForSelect( $test );
?>

Romanday
19-03-2006, 02:54
Hast recht, ich hab aber ziemlich lang gebraucht bis ich den String dann korrekt zusammengesetzt hatte.


Glaub ich dir, da geht viel Zeit drauf.
Das muß man eben abwägen ob es unbedingt notwenig ist
in einem Rutsch nach dem perfekten REGEX zu suchen.
IMHO ist dies nur selten zwingend.