Preg replace behalve .filename en -
Ik ben er zo slecht in: preg_replace()... Eerste tip die jullie zullen geven: WORD BETER IN PREG_REPLACE! Top, dat had ik al door :P
Hoe kan ik een filename zo krijgen, dat de bestandsnaam nog wel .filename bevat, maar de rest van de special chars vervangen worden met dashed (-)?
/.../ aanduiding van een PCRE pattern
[^...] [] is een character class, een verzameling tekens die vervolgens gematched worden (doordat we met ^ beginnen betekend het *niet* gematched worden)
:alnum: alle letters en cijfers
[^:alnum:.]+ match alles wat geen letter, cijfer of punt (.) is en doe dit 1 of meer keer (+). Zo wordt "foo & bar.png" niet "foo---bar.png", maar "foo-bar.png"
De trim is vervolgens nodig om de dash voor en achter te verwijderen, in het geval de filename "&foo.png" was (wat zonder trim resulteert in "-foo.png").
http://regexr.com/
Ik ben zelf ook geen held dat ik regex code uit mijn hoofd kan schrijven, maar met deze website krijg ik altijd het wel voor elkaar wat ik wil hebben.
Wat jij wil, is een "not word" en dat is "\W" daarbij geef je aan dat je niet "." wil converteren dus dan gebruik je de NOT operator in regex "(?![])" Aangezien een . een speciale karakter is, escapen met "\".
Kijk eens even op Ik ben zelf ook geen held dat ik regex code uit mijn hoofd kan schrijven, maar met deze website krijg ik altijd het wel voor elkaar wat ik wil hebben.
Wat jij wil, is een "not word" en dat is "\W" daarbij geef je aan dat je niet "." wil converteren dus dan gebruik je de NOT operator in regex "(?![])" Aangezien een . een speciale karakter is, escapen met "\".
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
# om maar even de code van boven te "lenen".
trim(preg_replace('/(?![\.])\W/', '-', $filename), '-');
trim(preg_replace('/(?![\.])\W+/', '-', $filename), '-'); // multiline
?>
# om maar even de code van boven te "lenen".
trim(preg_replace('/(?![\.])\W/', '-', $filename), '-');
trim(preg_replace('/(?![\.])\W+/', '-', $filename), '-'); // multiline
?>
Gewijzigd op 08/08/2015 20:19:11 door Johan K
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$string = "Test. nummer #1.png";
$ext = substr($string, strrpos($string, '.'));
$name = preg_replace("/[^A-Za-z0-9]/", '-', substr($string, 0, strrpos($string, '.')));
echo $name . $ext;
// output Test--nummer--1.png
$string = "Test. nummer #2.png";
$ext = substr($string, strrpos($string, '.'));
$name = preg_replace("/[^A-Za-z0-9 ]/", '', substr($string, 0, strrpos($string, '.')));
$name = preg_replace("/[^A-Za-z0-9]/", '-', $name);
echo $name . $ext;
// output Test-nummer-2.png
?>
$string = "Test. nummer #1.png";
$ext = substr($string, strrpos($string, '.'));
$name = preg_replace("/[^A-Za-z0-9]/", '-', substr($string, 0, strrpos($string, '.')));
echo $name . $ext;
// output Test--nummer--1.png
$string = "Test. nummer #2.png";
$ext = substr($string, strrpos($string, '.'));
$name = preg_replace("/[^A-Za-z0-9 ]/", '', substr($string, 0, strrpos($string, '.')));
$name = preg_replace("/[^A-Za-z0-9]/", '-', $name);
echo $name . $ext;
// output Test-nummer-2.png
?>
Gewijzigd op 08/08/2015 20:26:51 door Stefan Fransen
'/(?![\.])(\W)+/'
Het enigeste qua efficientcy zal ik deze functies gebruiken i.p.v. substrings of explodes.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$path_parts = pathinfo($filename, PATHINFO_FILENAME | PATHINFO_EXTENSION);
echo $path_parts['extension'], "\n";
echo $path_parts['filename'], "\n"; // since PHP 5.2.0
$path_parts = pathinfo('/www/htdocs/inc/lib.inc.php');
echo $path_parts['dirname'], "\n";
echo $path_parts['basename'], "\n";
echo $path_parts['extension'], "\n";
echo $path_parts['filename'], "\n"; // since PHP 5.2.0
?>
$path_parts = pathinfo($filename, PATHINFO_FILENAME | PATHINFO_EXTENSION);
echo $path_parts['extension'], "\n";
echo $path_parts['filename'], "\n"; // since PHP 5.2.0
$path_parts = pathinfo('/www/htdocs/inc/lib.inc.php');
echo $path_parts['dirname'], "\n";
echo $path_parts['basename'], "\n";
echo $path_parts['extension'], "\n";
echo $path_parts['filename'], "\n"; // since PHP 5.2.0
?>
Volgens mij kan dat ook volledig met regex, maar dat gaat mij een niveautje te hoog maar dit zou prima moeten werken.
Gewijzigd op 08/08/2015 20:44:04 door Johan K