Regex en preg_replace probleem
Code (php)
1
2
3
4
5
2
3
4
5
<?php
$page = preg_replace('#(.+?)\[page=(.+?)\](.+?)\[\/page\](.+?)#', '$1', $text,
1);
$page = str_replace(' ', '_', $page);
?>
$page = preg_replace('#(.+?)\[page=(.+?)\](.+?)\[\/page\](.+?)#', '$1', $text,
1);
$page = str_replace(' ', '_', $page);
?>
En dit zit in $text:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<table width="360" border="0" cellpadding="0" cellspacing="5" style="margin-left: 100px;">
<tr>
<td align="center" valign="bottom"><img src="http://i17.tinypic.com/89j3c7d.jpg" /></td>
<td align="center" valign="bottom"><img src="http://i19.tinypic.com/6xqkep5.jpg" /></td>
</tr>
<tr>
<td>
<img src="../forum/images/flag_us.png"> TBA<br />
<img src="../forum/images/flag_eu.png"> TBA<br />
<img src="../forum/images/flag_au.png"> TBA
</td>
<td>
<img src="../forum/images/flag_us.png"> TBA<br />
<img src="../forum/images/flag_eu.png"> TBA<br />
<img src="../forum/images/flag_au.png"> TBA
</td>
</tr>
<tr>
<td align="center" colspan="2">
<a target="_blank" href="http://www.rockstarnorth.com"><img src="http://i9.tinypic.com/6y3rcd0.png"></a>
<a target="_blank" href="http://www.rockstargames.com"><img src="http://i15.tinypic.com/8fza4hj.png"></a>
</td>
</tr>
</table>
**Het Verhaal**
[page=Rockstar_Games]Rockstar[/page] heeft over GTA IV op dit moment zeer weinig informatie vrijgegeven. De game zal zich afspelen in New York en het [page=Niko_Bellic]personage[/page] heeft een Russisch accent. Wat we ook weten is dat de game de [page]NaturalMotion[/page] [page]Euphoria[/page] engine draagt en daarom zeer mooie graphics heeft en de game zal tegelijk op de [page=PS3]Playstation 3[/page] en [page]Xbox 360[/page] uitgegeven worden. Er zijn geruchten dat de game ook op de [page]Nintendo Wii[/page] verkrijgbaar zal zijn maar dit is niet zeker, over de PC versie is niets bekend.
<tr>
<td align="center" valign="bottom"><img src="http://i17.tinypic.com/89j3c7d.jpg" /></td>
<td align="center" valign="bottom"><img src="http://i19.tinypic.com/6xqkep5.jpg" /></td>
</tr>
<tr>
<td>
<img src="../forum/images/flag_us.png"> TBA<br />
<img src="../forum/images/flag_eu.png"> TBA<br />
<img src="../forum/images/flag_au.png"> TBA
</td>
<td>
<img src="../forum/images/flag_us.png"> TBA<br />
<img src="../forum/images/flag_eu.png"> TBA<br />
<img src="../forum/images/flag_au.png"> TBA
</td>
</tr>
<tr>
<td align="center" colspan="2">
<a target="_blank" href="http://www.rockstarnorth.com"><img src="http://i9.tinypic.com/6y3rcd0.png"></a>
<a target="_blank" href="http://www.rockstargames.com"><img src="http://i15.tinypic.com/8fza4hj.png"></a>
</td>
</tr>
</table>
**Het Verhaal**
[page=Rockstar_Games]Rockstar[/page] heeft over GTA IV op dit moment zeer weinig informatie vrijgegeven. De game zal zich afspelen in New York en het [page=Niko_Bellic]personage[/page] heeft een Russisch accent. Wat we ook weten is dat de game de [page]NaturalMotion[/page] [page]Euphoria[/page] engine draagt en daarom zeer mooie graphics heeft en de game zal tegelijk op de [page=PS3]Playstation 3[/page] en [page]Xbox 360[/page] uitgegeven worden. Er zijn geruchten dat de game ook op de [page]Nintendo Wii[/page] verkrijgbaar zal zijn maar dit is niet zeker, over de PC versie is niets bekend.
Hoe kan ik dan uiteindelijk zoiets raar in $page krijgen:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<table_width="360"_border="0"_cellpadding="0"_cellspacing="5"_style="margin-left:_100px;">
__<tr>
____<td_align="center"_valign="bottom"><img_src="http://i17.tinypic.com/89j3c7d.jpg"_/></td>
____<td_align="center"_valign="bottom"><img_src="http://i19.tinypic.com/6xqkep5.jpg"_/></td>
__</tr>
__<tr>
<td>
______<img_src="../forum/images/flag_us.png">_TBA<br_/>
__<img_src="../forum/images/flag_eu.png">_TBA<br_/>
__<img_src="../forum/images/flag_au.png">_TBA
____</td>
<td>
______<img_src="../forum/images/flag_us.png">_TBA<br_/>
__<img_src="../forum/images/flag_eu.png">_TBA<br_/>
__<img_src="../forum/images/flag_au.png">_TBA
____</td>
__</tr>
__<tr>
____<td_align="center"_colspan="2">
______<a_target="_blank"_href="http://www.rockstarnorth.com"><img_src="http://i9.tinypic.com/6y3rcd0.png"></a>
______<a_target="_blank"_href="http://www.rockstargames.com"><img_src="http://i15.tinypic.com/8fza4hj.png"></a>
____</td>
__</tr>
</table>
</td></tr></table><table_cellpadding="0"_cellspacing="0"_border="0"_width="630"_style="padding-top:_2px;_vertical-align:_middle;"><tr><td_class="content_top"><div_class="content_title">Het_Verhaal</div></td></tr><tr><td_class="content"_colspan="2">
[page=Rockstar_Games]Rockstar[/page]_heeft_over_GTA_IV_op_dit_moment_zeer_weinig_informatie_vrijgegeven._De_game_zal_zich_afspelen_in_New_York_en_het_heeft_een_Russisch_accent._Wat_we_ook_weten_is_dat_de_game_de_[page]NaturalMotion[/page]_[page]Euphoria[/page]_engine_draagt_en_daarom_zeer_mooie_graphics_heeft_en_de_game_zal_tegelijk_op_de_[page=PS3]Playstation_3[/page]_en_[page]Xbox_360[/page]_uitgegeven_worden._Er_zijn_geruchten_dat_de_game_ook_op_de_[page]Nintendo_Wii[/page]_verkrijgbaar_zal_zijn_maar_dit_is_niet_zeker,_over_de_PC_versie_is_niets_bekend.
__<tr>
____<td_align="center"_valign="bottom"><img_src="http://i17.tinypic.com/89j3c7d.jpg"_/></td>
____<td_align="center"_valign="bottom"><img_src="http://i19.tinypic.com/6xqkep5.jpg"_/></td>
__</tr>
__<tr>
<td>
______<img_src="../forum/images/flag_us.png">_TBA<br_/>
__<img_src="../forum/images/flag_eu.png">_TBA<br_/>
__<img_src="../forum/images/flag_au.png">_TBA
____</td>
<td>
______<img_src="../forum/images/flag_us.png">_TBA<br_/>
__<img_src="../forum/images/flag_eu.png">_TBA<br_/>
__<img_src="../forum/images/flag_au.png">_TBA
____</td>
__</tr>
__<tr>
____<td_align="center"_colspan="2">
______<a_target="_blank"_href="http://www.rockstarnorth.com"><img_src="http://i9.tinypic.com/6y3rcd0.png"></a>
______<a_target="_blank"_href="http://www.rockstargames.com"><img_src="http://i15.tinypic.com/8fza4hj.png"></a>
____</td>
__</tr>
</table>
</td></tr></table><table_cellpadding="0"_cellspacing="0"_border="0"_width="630"_style="padding-top:_2px;_vertical-align:_middle;"><tr><td_class="content_top"><div_class="content_title">Het_Verhaal</div></td></tr><tr><td_class="content"_colspan="2">
[page=Rockstar_Games]Rockstar[/page]_heeft_over_GTA_IV_op_dit_moment_zeer_weinig_informatie_vrijgegeven._De_game_zal_zich_afspelen_in_New_York_en_het_heeft_een_Russisch_accent._Wat_we_ook_weten_is_dat_de_game_de_[page]NaturalMotion[/page]_[page]Euphoria[/page]_engine_draagt_en_daarom_zeer_mooie_graphics_heeft_en_de_game_zal_tegelijk_op_de_[page=PS3]Playstation_3[/page]_en_[page]Xbox_360[/page]_uitgegeven_worden._Er_zijn_geruchten_dat_de_game_ook_op_de_[page]Nintendo_Wii[/page]_verkrijgbaar_zal_zijn_maar_dit_is_niet_zeker,_over_de_PC_versie_is_niets_bekend.
Ik snap er echt niets van.
Hier vervang je de eerste entry van [page=abc]xyz[/page] door alles wat ervoor komt. Dat bedoel je vast niet.
abc
$1 matches alles wat voor de eerste [page] komt. Probeer eerst je regex is compleet te krijgen.
Code (php)
1
2
3
4
2
3
4
<?
$page = preg_replace('#(.+?)\[page=(.+?)\](.+?)\[\/page\](.+?)#', '$1', $text,
1);
?>
$page = preg_replace('#(.+?)\[page=(.+?)\](.+?)\[\/page\](.+?)#', '$1', $text,
1);
?>
Hier geef je de opdracht om alle spaties met underscores te veranderen. Bedoel je iets anders?
Het lijkt er op dat je regex niet gematcht wordt en die strepen zijn gewoon het gevolg van je str_replace.
Maar arend, die $1 moest $2 zijn, ik had het veranderd toen ik even zat te kijken. En ik snap echt niets van Regex. Ik heb er al zo veel (verloren) tijd in zitten. Maar ik wil dus dit uiteindelijk als $page krijgen: '[page=BLA]Hallo[/page]' => 'BLA'
Maar dat hoort toch eigenlijk zo te zijn met wat ik heb gemaakt?
Maar ik krijg nogsteeds het zelfde resultaat.
De regex uit mijn eerdere post klopt, en werkt hier zoals hij zou moeten werken.. Maar misschien begrijp ik niet precies wat jij wil, leg anders eens uit, zoals ik eerder vroeg, wat wil je precies als resultaat?
Gewijzigd op 01/01/1970 01:00:00 door Arend a
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
$matches = preg_match_all('#\[page=(.*?)\](.*?)\[\/page\]#', $text, $matches);
if ($matches >= 1) {
for ($i = 1; $i <= $matches; $i++) {
$page = preg_replace('#^\[page=(.+?)\].+?\[\/page\]$#', '$1', $text, 1);
$page = str_replace(' ', '_', $page);
$page_count = mysql_result(mysql_query("SELECT COUNT(id) FROM content_pages WHERE title = '" . $page . "' LIMIT 1"), 0);
if ($page_count == 1) {
$text = preg_replace('#\[page=(.*?)\](.*?)\[\/page\]#', '<a href="?p=$1">$2</a>', $text, 1);
} else {
$text = preg_replace('#\[page=(.*?)\](.*?)\[\/page\]#', '<a href="?p=$1" style="color: #CC3300;">$2</a>', $text, 1);
}
}
}
$matches = preg_match_all('#\[page\](.*?)\[\/page\]#', $text, $matches);
if ($matches >= 1) {
for ($i = 1; $i <= $matches; $i++) {
$page = preg_replace('#^\[page\](.+?)\[\/page\]$#', '$1', $text, 1);
$page = str_replace(' ', '_', $page);
$page_count = mysql_result(mysql_query("SELECT COUNT(id) FROM content_pages WHERE title = '" . $page . "' LIMIT 1"), 0);
if ($page_count == 1) {
$text = preg_replace('#\[page\](.*?)\[\/page\]#', '<a href="?p=$1">$1</a>', $text, 1);
} else {
$text = preg_replace('#\[page\](.*?)\[\/page\]#', '<a href="?p=$1" style="color: #CC3300;">$1</a>', $text, 1);
}
}
}
?>
$matches = preg_match_all('#\[page=(.*?)\](.*?)\[\/page\]#', $text, $matches);
if ($matches >= 1) {
for ($i = 1; $i <= $matches; $i++) {
$page = preg_replace('#^\[page=(.+?)\].+?\[\/page\]$#', '$1', $text, 1);
$page = str_replace(' ', '_', $page);
$page_count = mysql_result(mysql_query("SELECT COUNT(id) FROM content_pages WHERE title = '" . $page . "' LIMIT 1"), 0);
if ($page_count == 1) {
$text = preg_replace('#\[page=(.*?)\](.*?)\[\/page\]#', '<a href="?p=$1">$2</a>', $text, 1);
} else {
$text = preg_replace('#\[page=(.*?)\](.*?)\[\/page\]#', '<a href="?p=$1" style="color: #CC3300;">$2</a>', $text, 1);
}
}
}
$matches = preg_match_all('#\[page\](.*?)\[\/page\]#', $text, $matches);
if ($matches >= 1) {
for ($i = 1; $i <= $matches; $i++) {
$page = preg_replace('#^\[page\](.+?)\[\/page\]$#', '$1', $text, 1);
$page = str_replace(' ', '_', $page);
$page_count = mysql_result(mysql_query("SELECT COUNT(id) FROM content_pages WHERE title = '" . $page . "' LIMIT 1"), 0);
if ($page_count == 1) {
$text = preg_replace('#\[page\](.*?)\[\/page\]#', '<a href="?p=$1">$1</a>', $text, 1);
} else {
$text = preg_replace('#\[page\](.*?)\[\/page\]#', '<a href="?p=$1" style="color: #CC3300;">$1</a>', $text, 1);
}
}
}
?>
Ik snap niet waarom $page niet gewoon [page=dit]titel[/page] of [page]titel[/page] wordt.
[page]1[/page]
[page=1]2[/page]
dit maken:
<a href="1">1</a>
<a href="1" title="2">2</a>
Ik denk dat dit dan wel werkt:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
$tekst = preg_replace(
array('/\[ *page *\](.+?)\[ *\/ *page *\]/i', '/\[ *page *= *(.+?) *\](.+?)\[ *\/ *page *\]/i'),
array('<a href="$1">$1</a>','<a href="$2" title="$1">$1</a>'),
$tekst);
?>
$tekst = preg_replace(
array('/\[ *page *\](.+?)\[ *\/ *page *\]/i', '/\[ *page *= *(.+?) *\](.+?)\[ *\/ *page *\]/i'),
array('<a href="$1">$1</a>','<a href="$2" title="$1">$1</a>'),
$tekst);
?>
Niet getest, maar zou moeten werken.
Gewijzigd op 01/01/1970 01:00:00 door Martijn B
Nee, je begrijpt het niet, [page=BLA]BLA2[/page], dan moet ik dus BLA hebben en dan kijk ik of die bestaat in de database, dan is de link zwart, zoniet is de link rood idem voor [page]BLA[/page], dan moet ik gewoon BLA hebben.
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
$tekst = preg_replace(
array('/\[ *page *\](.+?)\[ *\/ *page *\]/i', '/\[ *page *= *(.+?) *\](.+?)\[ *\/ *page *\]/i'),
'$1',
$tekst);
?>
$tekst = preg_replace(
array('/\[ *page *\](.+?)\[ *\/ *page *\]/i', '/\[ *page *= *(.+?) *\](.+?)\[ *\/ *page *\]/i'),
'$1',
$tekst);
?>
Nee, nog niet. En ik hoef ook niet dat hij 2 dingen tegelijk replaced, gewoon eerst alleen [page=][/page], daarna als dat werkt lukt [page][/page] ook wel.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<?php
// [page][/page]
$sString = 'Een tekst met [page]een pagina[/page] erin.';
preg_match('_\[page\](.+?)\[/page\]_is', $sString, $aResult);
echo $aResult[1].'<br>';
// [page=][/page]
$sString = 'Een andere tekst [page=pagina]met tekst[/page] erin.';
preg_match('_\[page=(.+?)\](.+?)\[/page\]_is', $sString, $aResult);
echo $aResult[1].': '.$aResult[2];
?>
// [page][/page]
$sString = 'Een tekst met [page]een pagina[/page] erin.';
preg_match('_\[page\](.+?)\[/page\]_is', $sString, $aResult);
echo $aResult[1].'<br>';
// [page=][/page]
$sString = 'Een andere tekst [page=pagina]met tekst[/page] erin.';
preg_match('_\[page=(.+?)\](.+?)\[/page\]_is', $sString, $aResult);
echo $aResult[1].': '.$aResult[2];
?>
Nu kun je zelf verder met die variabelen en controleren in de database. Daarna zou je afhankelijk daarvan een preg_replace kunnen uitvoeren waarbij je dezelfde regexen gebruikt...
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
Echt bedankt, ik heb aan deze manier nog niet gedacht, echt bedankt..
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
$matches = preg_match_all('#\[page=(.*?)\](.*?)\[\/page\]#', $text, $matches);
if ($matches >= 1) {
for ($i = 1; $i <= $matches; $i++) {
preg_match('_\[page=(.+?)\](.+?)\[/page\]_is', $text, $page);
$page = str_replace(' ', '_', $page[1]);
$page_count = mysql_result(mysql_query("SELECT COUNT(id) FROM content_pages WHERE title = '" . $page . "' LIMIT 1"), 0);
if ($page_count == 1) {
$text = preg_replace('#\[page=(.*?)\](.*?)\[\/page\]#', '<a href="?p=$1">$2</a>', $text, 1);
} else {
$text = preg_replace('#\[page=(.*?)\](.*?)\[\/page\]#', '<a href="?p=$1" style="color: #CC3300;">$2</a>', $text, 1);
}
}
}
$matches = preg_match_all('#\[page\](.*?)\[\/page\]#', $text, $matches);
if ($matches >= 1) {
for ($i = 1; $i <= $matches; $i++) {
preg_match('_\[page\](.+?)\[/page\]_is', $text, $page);
$page = str_replace(' ', '_', $page[1]);
$page_count = mysql_result(mysql_query("SELECT COUNT(id) FROM content_pages WHERE title = '" . $page . "' LIMIT 1"), 0);
if ($page_count == 1) {
$text = preg_replace('#\[page\](.*?)\[\/page\]#', '<a href="?p=$1">$1</a>', $text, 1);
} else {
$text = preg_replace('#\[page\](.*?)\[\/page\]#', '<a href="?p=$1" style="color: #CC3300;">$1</a>', $text, 1);
}
}
}
?>
$matches = preg_match_all('#\[page=(.*?)\](.*?)\[\/page\]#', $text, $matches);
if ($matches >= 1) {
for ($i = 1; $i <= $matches; $i++) {
preg_match('_\[page=(.+?)\](.+?)\[/page\]_is', $text, $page);
$page = str_replace(' ', '_', $page[1]);
$page_count = mysql_result(mysql_query("SELECT COUNT(id) FROM content_pages WHERE title = '" . $page . "' LIMIT 1"), 0);
if ($page_count == 1) {
$text = preg_replace('#\[page=(.*?)\](.*?)\[\/page\]#', '<a href="?p=$1">$2</a>', $text, 1);
} else {
$text = preg_replace('#\[page=(.*?)\](.*?)\[\/page\]#', '<a href="?p=$1" style="color: #CC3300;">$2</a>', $text, 1);
}
}
}
$matches = preg_match_all('#\[page\](.*?)\[\/page\]#', $text, $matches);
if ($matches >= 1) {
for ($i = 1; $i <= $matches; $i++) {
preg_match('_\[page\](.+?)\[/page\]_is', $text, $page);
$page = str_replace(' ', '_', $page[1]);
$page_count = mysql_result(mysql_query("SELECT COUNT(id) FROM content_pages WHERE title = '" . $page . "' LIMIT 1"), 0);
if ($page_count == 1) {
$text = preg_replace('#\[page\](.*?)\[\/page\]#', '<a href="?p=$1">$1</a>', $text, 1);
} else {
$text = preg_replace('#\[page\](.*?)\[\/page\]#', '<a href="?p=$1" style="color: #CC3300;">$1</a>', $text, 1);
}
}
}
?>
Als ik nu een bijvoorbeeld [page]blaat'metquote''[/page] invul, gaat jouw query hopeloos de soep in.
Dit is ook niet echt logisch. $matches is namelijk een array die alle matches van de preg_match_all bevat, geen aantal...
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
$matches = preg_match_all('#\{\{template=(.*?)\}\}#', $text, $matches);
if ($matches >= 1) {
require_once("../includes/template_parser.class.php");
for ($i = 1; $i <= $matches; $i++) {
$title = preg_match('_\{\{template=(.*?)\}\}(.*?)_is', $text, $title);
echo $title[1];
$var_query = mysql_query("SELECT vars, template FROM content_templates WHERE title = '" . $title[1] . "' LIMIT 1");
$var_row = mysql_fetch_row($var_query);
$parse = new parser($var_row[1]);
$vars = explode(',', $var_row[0]);
$tot_vars = count($vars);
for ($p = 0; $p < $tot_vars; $p++) {
preg_match('_\{\{' . $vars[$p] . '=(.+?)\}\}_is', $text, $output);
$parse->assign($vars[$p], $output[1]);
}
$template = '#\{\{template=' . $title[1] . '\}\}' . $title[2] . '#';
$output = $parse->output();
$text = preg_replace($template, $output, $text, 1);
}
}
?>
$matches = preg_match_all('#\{\{template=(.*?)\}\}#', $text, $matches);
if ($matches >= 1) {
require_once("../includes/template_parser.class.php");
for ($i = 1; $i <= $matches; $i++) {
$title = preg_match('_\{\{template=(.*?)\}\}(.*?)_is', $text, $title);
echo $title[1];
$var_query = mysql_query("SELECT vars, template FROM content_templates WHERE title = '" . $title[1] . "' LIMIT 1");
$var_row = mysql_fetch_row($var_query);
$parse = new parser($var_row[1]);
$vars = explode(',', $var_row[0]);
$tot_vars = count($vars);
for ($p = 0; $p < $tot_vars; $p++) {
preg_match('_\{\{' . $vars[$p] . '=(.+?)\}\}_is', $text, $output);
$parse->assign($vars[$p], $output[1]);
}
$template = '#\{\{template=' . $title[1] . '\}\}' . $title[2] . '#';
$output = $parse->output();
$text = preg_replace($template, $output, $text, 1);
}
}
?>
Hierbij krijg is $title[1] gewoon leeg :S Weet iemand hoe dat komt?