Regex en preg_replace probleem

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Onbekend Onbekend

Onbekend Onbekend

04/01/2008 20:37:00
Quote Anchor link
Stel, ik heb deze preg_replace en/of regex:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
$page
= preg_replace('#(.+?)\[page=(.+?)\](.+?)\[\/page\](.+?)#', '$1', $text,
1);
$page = str_replace(' ', '_', $page);
?>


En dit zit in $text:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<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.


Hoe kan ik dan uiteindelijk zoiets raar in $page krijgen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<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.


Ik snap er echt niets van.
 
PHP hulp

PHP hulp

22/12/2024 17:25:20
 
Arend a

Arend a

04/01/2008 20:53:00
Quote Anchor link
Je doet een paar rare dingen. Wat wil je dat het resultaat?

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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?
$page
= preg_replace('#(.+?)\[page=(.+?)\](.+?)\[\/page\](.+?)#', '$1', $text,
1);
?>



Hier geef je de opdracht om alle spaties met underscores te veranderen. Bedoel je iets anders?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$page
= str_replace(' ', '_', $page);
?>
 
Jan Koehoorn

Jan Koehoorn

04/01/2008 20:54:00
Quote Anchor link
Het lijkt er op dat je regex niet gematcht wordt en die strepen zijn gewoon het gevolg van je str_replace.
 
Onbekend Onbekend

Onbekend Onbekend

04/01/2008 21:16:00
Quote Anchor link
Ja dat klopt jan, maar dat moet ook, omdat $page zo vaag wordt zijn er heel veel spaties.

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?
 
Arend a

Arend a

04/01/2008 21:19:00
Quote Anchor link
Dit zou voldoende moeten zijn.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$page
= preg_replace('#\[page=(.+?)\].+?\[\/page\]#', '$1', $text, 1);
?>
 
Onbekend Onbekend

Onbekend Onbekend

04/01/2008 21:21:00
Quote Anchor link
Ja maar er kan voor [page=bla] ook nog text staan en er achter ook.

Maar ik krijg nogsteeds het zelfde resultaat.
 
Arend a

Arend a

04/01/2008 23:49:00
Quote Anchor link
Een regex matched alleen vanaf het begin van een string tot een eind als je dat expliciet aangeeft, zoals hier:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$page
= preg_replace('#^\[page=(.+?)\].+?\[\/page\]$#', '$1', $text, 1);
?>


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
 
Onbekend Onbekend

Onbekend Onbekend

05/01/2008 10:28:00
Quote Anchor link
Met die nieuwe van je lukt het nog niet. Ik probeer(de) net zo iets te maken als mediawiki heeft, als een link bestaat dan is hij zwart, als de link niet bestaat wordt hij rood.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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);
                }
            }
        }

?>


Ik snap niet waarom $page niet gewoon [page=dit]titel[/page] of [page]titel[/page] wordt.
 
Martijn B

Martijn B

05/01/2008 11:43:00
Quote Anchor link
Je wil dus van:
[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)
PHP script in nieuw venster Selecteer het PHP script
1
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);
?>


Niet getest, maar zou moeten werken.
Gewijzigd op 01/01/1970 01:00:00 door Martijn B
 
Onbekend Onbekend

Onbekend Onbekend

05/01/2008 11:51:00
Quote Anchor link
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.
 
Martijn B

Martijn B

05/01/2008 11:54:00
Quote Anchor link
Zo dan:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
$tekst
= preg_replace(
array('/\[ *page *\](.+?)\[ *\/ *page *\]/i', '/\[ *page *= *(.+?) *\](.+?)\[ *\/ *page *\]/i'),
'$1',
$tekst);
?>
 
Onbekend Onbekend

Onbekend Onbekend

05/01/2008 11:58:00
Quote Anchor link
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.
 
Joren de Wit

Joren de Wit

05/01/2008 12:23:00
Quote Anchor link
Om de betreffende delen te matchen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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];
?>

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
 
Onbekend Onbekend

Onbekend Onbekend

05/01/2008 12:36:00
Quote Anchor link
Blanche, je bent geweldig :) (zoals altijd)

Echt bedankt, ik heb aan deze manier nog niet gedacht, echt bedankt..

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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);
                }
            }
        }

?>
 
Joren de Wit

Joren de Wit

05/01/2008 12:40:00
Quote Anchor link
Pas nog wel even beveiliging op de input in je query toe en bouw ook nog even de foutafhandeling in.

Als ik nu een bijvoorbeeld [page]blaat'metquote''[/page] invul, gaat jouw query hopeloos de soep in.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
if ($matches >= 1) {
?>

Dit is ook niet echt logisch. $matches is namelijk een array die alle matches van de preg_match_all bevat, geen aantal...
 
Onbekend Onbekend

Onbekend Onbekend

06/01/2008 13:22:00
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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);
            }
        }

?>


Hierbij krijg is $title[1] gewoon leeg :S Weet iemand hoe dat komt?
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.