[PHP] preg_match_all & str_replace werkt niet zoals verwacht

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Hmmbob
  • Registratie: September 2001
  • Laatst online: 21:13
Ik ben een (Joomla) Twitter-module voor onze site aan het bewerken, zodat deze meer aan onze wensen voldoet. Nu zette deze module al automatisch links om naar klikbare href's, maar zoiets wilde ik ook hebben voor @users en #hashtags. Ik heb daarvoor het gedeelte wat gebruikt wordt voor de URLs slightly aangepast tot dit:

PHP:
1
2
3
4
5
6
7
8
9
10
// $status->text bevat reeds de volledige tweet-text

// Make @username a link to a username's profile.
$pattern_user = '/@([a-zA-Z0-9_]*)/';
preg_match_all($pattern_user, $status->text, $matches_user);
  foreach($matches_user[1] as $index=>$user)
    if($index == 0 || $matches_user[1][$index] != $matches_user[1][$index-1]):
       $status->text = str_replace($user, '<a href="http://twitter.com/'.$user.'" target="_blank">'.$user.'</a>', $status->text);
    endif;
echo $status->text;


Op zich gebeurt er nu gedeeltelijk wat ik wil: de username wordt klikbaar. Echter, in plaats van @User zou ik graag @User willen hebben (de @ dus ook in de link).

Ik zit me volledig dood te staren, en heb geen clue wat ik nu fout doe... Iemand die me een por in de juiste richting kan geven?

Sometimes you need to plan for coincidence


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Groentenboer schreef op woensdag 07 juli 2010 @ 15:00:
Ik zit me volledig dood te staren, en heb geen clue wat ik nu fout doe... Iemand die me een por in de juiste richting kan geven?
De @ ook in de match group zetten :?
PHP:
1
$pattern_user = '/(@[a-zA-Z0-9_]*)/'

Edit: Oh, wacht, dan heb je de @ ook in de URL natuurlijk. Kwestie van die er effe af strippen:
PHP:
1
$status->text = str_replace($user, '<a href="http://twitter.com/'.substr($user,1).'" target="_blank">'.$user.'</a>', $text);

[ Voor 34% gewijzigd door RobIII op 07-07-2010 15:13 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Retpics
  • Registratie: Juni 2007
  • Laatst online: 19-09 15:18
foreach($matches_user[1] as $index=>$user)
veranderen in:
foreach($matches_user[0] as $index=>$user)

[Edit]: Dan is de link niet goed, momentje
[Edit 2]: Zo zou het moeten werken: (substr toegevoegd om de @ weg te halen in de link)

PHP:
1
2
3
4
5
6
7
8
// Make @username a link to a username's profile. 
$pattern_user = '/@([a-zA-Z0-9_]*)/'; 
preg_match_all($pattern_user, $status->text, $matches_user);
  foreach($matches_user[0] as $index=>$user) 
    if($index == 0 || $matches_user[1][$index] != $matches_user[1][$index-1]): 
       $status->text = str_replace($user, '<a href="http://twitter.com/'.substr($user, 1).'" target="_blank">'.$user.'</a>', $status->text); 
    endif; 
echo $status->text;

[ Voor 84% gewijzigd door Retpics op 07-07-2010 15:08 ]


Acties:
  • 0 Henk 'm!

  • gertjuhh
  • Registratie: April 2004
  • Laatst online: 26-04 09:14
Je zou ook een preg_replace kunnen gebruiken
PHP:
1
preg_replace('/@([a-zA-Z0-9_]+)/', '<a href="http://twitter.com/\1" target="_blank">@\1</a>', $status->text);

Acties:
  • 0 Henk 'm!

  • Hmmbob
  • Registratie: September 2001
  • Laatst online: 21:13
Retpics schreef op woensdag 07 juli 2010 @ 15:05:
foreach($matches_user\[1] as $index=>$user)
veranderen in:
foreach($matches_user\[0] as $index=>$user)

[Edit]: Dan is de link niet goed, momentje
[Edit 2]: Zo zou het moeten werken: (substr toegevoegd om de @ weg te halen in de link)

PHP:
1
2
3
4
5
6
7
8
// Make @username a link to a username's profile. 
$pattern_user = '/@([a-zA-Z0-9_]*)/'; 
preg_match_all($pattern_user, $status->text, $matches_user);
  foreach($matches_user[0] as $index=>$user) 
    if($index == 0 || $matches_user[1][$index] != $matches_user[1][$index-1]): 
       $status->text = str_replace($user, '<a href="http://twitter.com/'.substr($user, 1).'" target="_blank">'.$user.'</a>', $status->text); 
    endif; 
echo $status->text;
Dat zeg ik... Daar zit je je dan op dood te staren.... :X

Anyway, dit werkt (uiteraard)! Dank voor je hulp... Ooit kijk je zo lang naar een stuk code dat je het gewoon niet meer ziet...

Sometimes you need to plan for coincidence


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Groentenboer schreef op woensdag 07 juli 2010 @ 20:42:
[...]
Ooit kijk je zo lang naar een stuk code dat je het gewoon niet meer ziet...
Naar code staren is pure tijdsverspilling. Je moet debuggen. Stap voor stap nagaan wat er gebeurt en nagaan of dat ook de bedoeling is.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Ik vind de manier van gertjuhh in "[PHP] preg_match_all & str_replace werkt..." toch een stuk schoner om eerlijk te zijn. Minder bloat. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Hmmbob
  • Registratie: September 2001
  • Laatst online: 21:13
NMe schreef op woensdag 07 juli 2010 @ 21:35:
Ik vind de manier van gertjuhh in "[PHP] preg_match_all & str_replace werkt..." toch een stuk schoner om eerlijk te zijn. Minder bloat. :)
Eensch, maar werkt niet... Wordt geen link gegenereerd.

Sometimes you need to plan for coincidence


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Groentenboer schreef op woensdag 07 juli 2010 @ 21:37:
[...]

Eensch, maar werkt niet... Wordt geen link gegenereerd.
En omdat copy/paste niet werkt geven we het maar op :? Goeie insteek d:)b

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Hmmbob
  • Registratie: September 2001
  • Laatst online: 21:13
RobIII schreef op woensdag 07 juli 2010 @ 21:42:
[...]

En omdat copy/paste niet werkt geven we het maar op :? Goeie insteek d:)b
Dank voor deze goedbedoelde schop onder den aarsch, ik was as we speak (spoke) aan het kijken of ik kon ontdekken waar het hem in zit. Vind de oplossing zelf namelijk ook stukken mooier, maar heb niet eerder met de preg-functies en de expressies die daar bij horen gewerkt. Dus duurt wat langer dan de profs die hier rondlopen en de fout snel zien waarschijnlijk...
Anders let je gewoon even op basis PHP-syntax :X

Het is dus dit geworden:
PHP:
1
$status->text = preg_replace('/@([a-zA-Z0-9_]*)/', '<a href="http://twitter.com/$1" target="_blank">@$1</a>', $status->text);


Tijd voor het bed denk ik zo... :F
NMe schreef op woensdag 07 juli 2010 @ 21:35:
Ik vind de manier van gertjuhh in "[PHP] preg_match_all & str_replace werkt..." toch een stuk schoner om eerlijk te zijn. Minder bloat. :)
Je hebt gelijk. Voor de beeldvorming, voor het maken van al die links heb ik nu voldoende aan deze code:
PHP:
1
2
3
4
5
6
// Replace Links, create Twitter @user-links and #hash-links:
$pattern_url = '/((ftp|https?):\/\/(\w+:{0,1}\w*@)?([^,^;^!^:^ \t\r\n\v\f]+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?)/';
$status->text = preg_replace($pattern_url, '<a href="$1" target="_blank">$1</a>', $status->text);
$status->text = preg_replace('/@([a-zA-Z0-9_]*)/', '<a href="http://twitter.com/$1" target="_blank">@$1</a>', $status->text); 
$status->text = preg_replace('/#([a-zA-Z0-9_]*)/', '<a href="http://twitter.com/#search?q=$1" target="_blank">#$1</a>', $status->text);
echo $status->text;

Met dank voor jullie hulp, stuk beter leesbare code zo.

[ Voor 57% gewijzigd door Hmmbob op 07-07-2010 22:17 ]

Sometimes you need to plan for coincidence


Acties:
  • 0 Henk 'm!

  • gertjuhh
  • Registratie: April 2004
  • Laatst online: 26-04 09:14
NMe schreef op woensdag 07 juli 2010 @ 21:35:
Ik vind de manier van gertjuhh in "[PHP] preg_match_all & str_replace werkt..." toch een stuk schoner om eerlijk te zijn. Minder bloat. :)
Dat soort functionaliteit hebben ze niet voor niets in PHP ingebouwd ;)
Groentenboer schreef op woensdag 07 juli 2010 @ 21:37:
Eensch, maar werkt niet... Wordt geen link gegenereerd.
Ik ging er voor het gemak maar van uit dat je zelf wel wist wat je met de return waarde moest doen.
Maar ik zie dat het gelukt is, succes
Pagina: 1