preg replace bij youtube link
Ik heb onderstaande code, maar dat werkt niet.Heeft iemand met kennis van de preg replace functie een idee?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
<?php
$str = 'https://www.youtube.com/watch?v=S7DhdmDkRZo';
$pattern = 'https://www.youtube.com/watch?v=';
$result = preg_replace($pattern, '', $str);
echo $result;
?>
$str = 'https://www.youtube.com/watch?v=S7DhdmDkRZo';
$pattern = 'https://www.youtube.com/watch?v=';
$result = preg_replace($pattern, '', $str);
echo $result;
?>
Gewijzigd op 17/01/2024 17:51:28 door Paul Weiss
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<?php
$str = 'https://www.youtube.com/watch?v=S7DhdmDkRZo';
$pattern = 'https://www.youtube.com/watch?v=';
$result = str_replace($pattern, '', $str);
echo $result;
?>
$str = 'https://www.youtube.com/watch?v=S7DhdmDkRZo';
$pattern = 'https://www.youtube.com/watch?v=';
$result = str_replace($pattern, '', $str);
echo $result;
?>
Wat je met een preg_replace wel kunt doen is voorschrijven dat $pattern ook alleen maar aan het begin van de $str mag staan (maar de kans dat $pattern willekeurig nog eens ergens voorkomt in een YT URL lijkt me vrij klein):
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?php
$str = 'https://www.youtube.com/watch?v=S7DhdmDkRZo';
$pattern = 'https://www.youtube.com/watch?v=';
$result = preg_replace('/^' . preg_quote($pattern,'/') . '/i', '', $str);
echo $result;
?>
$str = 'https://www.youtube.com/watch?v=S7DhdmDkRZo';
$pattern = 'https://www.youtube.com/watch?v=';
$result = preg_replace('/^' . preg_quote($pattern,'/') . '/i', '', $str);
echo $result;
?>
Uitleg:
- Een regular expression begint en eindigt altijd met een delimiter. Meestal is dit de slash (in PHP kan het van alles zijn, maar andere talen zoals JavaScript gebruiken alleen de slash).
- ^ betekent "moet aan het begin van de $str staan"
- preg_replace escapet speciale karakters (die een specifieke functie in een regular expression hebben, zoals de slash). Je had ook kunnen schrijven (zelf escapen; dubbele backslash, omdat je de backslash in een string ook moet escapen)
- De "i" na de sluitende slash maakt de match case insensitive (als dit gebruikers input is kan een gebruiker natuurlijk ook YouTube.com schrijven). Je kunt natuurlijk ook str_ireplace gebruiken.
- Het vraagteken na "https" in het voorbeeld bij punt 3 zorgt ervoor dat zowel http:// als https:// werken (de "s" is optioneel dmv het vraagteken). Ook hier weer: als dit user input is maak je het wat robuuster.
Overigens: als je op zoek bent naar de YouTube code, kun je het ook andersom aanpakken:
Dit zoekt in de $str naar een stukje tekst dat begint met "v=" en dan wordt gevolg door een aantal alfanumerieke karakters (dus alles totdat er een niet alfanumeriek karakter voorbij komt, of het einde van de string). Dit is het \\w+ deel. Omdat er haakjes omheen staan is specifiek deze waarde later terug te vinden in $match[1] (in $match[0] staat de complete match, dus inclusief "v=").
Als de code (bijvoorbeeld) een lengte heeft van 8 tot 12 karakters kun je ook nog dit doen:
Lijkt me duidelijk waar die 8,12 zijn gebleven. De \\b erachter zorgt ervoor dat er dan ook een overgang tussen de alfanumerieke karakters en "wat anders" (witruimte, punt, komma, enz) zit (niet dat je max 12 karakter terugkrijgt, terwijl het er eigenlijk 13 waren; op deze manier heb je dan gewoon geen match).
Gewijzigd op 17/01/2024 22:14:37 door Rob Doemaarwat
Hartelijk dank iedereen voor jullie bijdragen. Ik vind de preg replace functie best wel complex als ik het zo mag zeggen. Maar ik ben door jullie in ieder geval geholpen.
SO is deze regex RFC 5322 compliant:
Je kunt ook de W3C HTML5 specificatie gebruiken, die is wat korter:
Volgens Code (php)
1
(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])
Je kunt ook de W3C HTML5 specificatie gebruiken, die is wat korter:
Code (php)
1
^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$