Regular Expression
ik ben totaal niet technisch, maar heb 2 regular expressions nodig om een verwijzing te doen naar een specifiek type pagina van een website. Eenmalig eigenlijk. Ik hoop dat ik hier aan het goede adres ben en iemand kan helpen.
De structuur van de site is als volgt:
1. domein: ww.domein.nl
2. Categorie: ww.domein.nl/categorie.html waarbij er verschillende soorten categorieën zijn, heren, dames, kids om maar wat te noemen
3. Subcategorie: ww.domein.nl/categorie/subcategorie.html waarbij er weer verschillende soorten subcategorieën zijn. Truien, broeken etc
Ik zoek dus als eerste een regular expression waarmee ik alle pagina's "vang" bij 2 (op categorieniveau) EN alle pagina's bij 3 (subcategorieniveau). En dat indien mogelijk in 1 regular expression. Als dat onmogelijk is dan in 2.
En nog een niveau dieper is het als volgt:
4. Product dat direct onder de categorie hangt: ww.domein.nl/categorie/productnaam-roze.html
5. Product dat onder de subcategorie hangt: ww.domein.nl/categorie/subcategorie/productnaam-roze.html
Voor 4 en 5, dus alle productpagina's, zoek ik ook een regular expression. Maar dat kunnen dus honderden verschillende producten zijn met uiteenlopende namen zonder logica.
Ik hoop dat dit duidelijk is verwoord en dat iemand hierbij kan assisteren.
Mijn dank is groot!
Roy
Als er alleen een categorie is zit die in match[1], een evt. sub-categorie in match[2], een evt-evt productnaam in match[3]
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
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
<?php
$r = '/^ww.domein.nl\\/(.+?)(?:\\/(.+?))?(?:\\/(.+?))?\\.html$/';
preg_match($r,'ww.domein.nl/categorie.html',$match);
print_r($match);
/* Array
(
[0] => ww.domein.nl/categorie.html
[1] => categorie
) */
preg_match($r,'ww.domein.nl/categorie/subcategorie.html',$match);
print_r($match);
/* Array
(
[0] => ww.domein.nl/categorie/subcategorie.html
[1] => categorie
[2] => subcategorie
) */
preg_match($r,'ww.domein.nl/categorie/subcategorie/productnaam-roze.html',$match);
print_r($match);
/* Array
(
[0] => ww.domein.nl/categorie/subcategorie/productnaam-roze.html
[1] => categorie
[2] => subcategorie
[3] => productnaam-roze
) */
?>
$r = '/^ww.domein.nl\\/(.+?)(?:\\/(.+?))?(?:\\/(.+?))?\\.html$/';
preg_match($r,'ww.domein.nl/categorie.html',$match);
print_r($match);
/* Array
(
[0] => ww.domein.nl/categorie.html
[1] => categorie
) */
preg_match($r,'ww.domein.nl/categorie/subcategorie.html',$match);
print_r($match);
/* Array
(
[0] => ww.domein.nl/categorie/subcategorie.html
[1] => categorie
[2] => subcategorie
) */
preg_match($r,'ww.domein.nl/categorie/subcategorie/productnaam-roze.html',$match);
print_r($match);
/* Array
(
[0] => ww.domein.nl/categorie/subcategorie/productnaam-roze.html
[1] => categorie
[2] => subcategorie
[3] => productnaam-roze
) */
?>
Ik neem overigens aan de het www (3x w) ipv ww moet zijn.
Gewijzigd op 15/11/2017 09:54:47 door Rob Doemaarwat
hoe herken je het verschil tussen (3) subcategorie.html en (4) productnaam-roze.html? Ziet er in de laatste altijd een "-" ?
Ik wil hier http://prntscr.com/haolnt een code plaatsen en ik heb 2 codes nodig.
1. Eén code die matcht met categorie EN subcategorie (dat zijn de zogenaamde productoverzichtpagina's, daar mogen dus geen productpagina's inzitten). Voorbeeld: http://prntscr.com/haoolg en http://prntscr.com/haootm
2. Eén code die matcht met alleen productpagina's. Dus alleen maar pagina's waar je een product in je winkelwagen kan stoppen. Zoals http://prntscr.com/haophz
groet!
Toevoeging op 15/11/2017 10:09:20:
Ivo P op 15/11/2017 09:54:57:
hoe herken je het verschil tussen (3) subcategorie.html en (4) productnaam-roze.html? Ziet er in de laatste altijd een "-" ?
Lastige, de "-" komt bijna altijd wel voor, maar is niet 100% zeker. En hij komt ook voor in de subcategorie. Zie voorbeeld: categoriepagina http://prntscr.com/haorbq en productpagina: http://prntscr.com/haorjf
Gewijzigd op 15/11/2017 10:18:53 door Roy Roy
Maar ik begrijp uit je tekst dat er geen verschil tussen 3 en 4 zit.
http://www.steppinout.nl/heren/lounge-pants.html en
http://www.steppinout.nl/heren/lounge-pants/lounge-pants-00003220-20.html
Ik begrijp niet wat je bedoelt met "1 kreet"..
En wat betreft het verschil tussen 3 en 4: producten hangen zowel aan de categorie als aan de subcategorie. Ik kan een groene heren trui vinden onder www.domein.nl/heren/groene-trui.html maar ook onder www.domein.nl/heren/truien/groene-trui.html maar hij zou ook nog kunnen hangen onder www.domein.nl/heren/truien-en-vesten/groene-trui.html
:)
In die linkjes zit een prt screen en daar zie je de URL in en die eindigen wel op html. Zie je die? Het zijn deze links: http://www.steppinout.nl/heren/lounge-pants/lounge-pants-00003220-20.html
Ik begrijp niet wat je bedoelt met "1 kreet"..
En wat betreft het verschil tussen 3 en 4: producten hangen zowel aan de categorie als aan de subcategorie. Ik kan een groene heren trui vinden onder www.domein.nl/heren/groene-trui.html maar ook onder www.domein.nl/heren/truien/groene-trui.html maar hij zou ook nog kunnen hangen onder www.domein.nl/heren/truien-en-vesten/groene-trui.html
:)
Gewijzigd op 15/11/2017 10:37:29 door Roy Roy
Als je linkjes in je post wilt gebruiken als toelichting, ,dan kun je die natuurlijk ook gewoon typen, ipv een screenshot op een andere server plaatsen en dan een link daarnaartoe plaatsen....
Houdt je verhaal wel zo leesbaar.
--
anyway: ik zie nog steeds geen verschil tussen 3 en 4.
Lijkt me handiger om in plaats daarvan de url op te splitsen op de /.
Als er maar 1 element is (of als $part[0] op .html eindigt), dan is dat de categorie.
else:
als deel 2 op .html eindigt (danwel, count($parts)==2), dan is deel 1 ook de categorie, en deel 2 is de subcat, of een artikel.
Dan zul je in je database moeten zoeken of deel 2 voorkomt als subcategorie. Zo niet, dan is het een artikel.
Ivo P op 15/11/2017 10:37:41:
Als je linkjes in je post wilt gebruiken als toelichting, ,dan kun je die natuurlijk ook gewoon typen, ipv een screenshot op een andere server plaatsen en dan een link daarnaartoe plaatsen....
Houdt je verhaal wel zo leesbaar.
Als je linkjes in je post wilt gebruiken als toelichting, ,dan kun je die natuurlijk ook gewoon typen, ipv een screenshot op een andere server plaatsen en dan een link daarnaartoe plaatsen....
Houdt je verhaal wel zo leesbaar.
Dank voor de tip! Ik had mijn reactie uitgebreid terwijl jij een reactie gaf. Dat maakte het al wat duidelijker denk/hoop ik
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
(?:\\/(.+?))?
( )? -> dit stuk is optioneel (ivm vraagteken d'r achter)
?: -> dit stuk wil ik niet terugzien in de matches
\\/ -> ivm deze forward slash die ik niet wil zien
(.+?) -> dit is de match die ik zoek (? = non-greedy = zo kort mogelijk =
niet de productnaam bij de sub-cat trekken)
( )? -> dit stuk is optioneel (ivm vraagteken d'r achter)
?: -> dit stuk wil ik niet terugzien in de matches
\\/ -> ivm deze forward slash die ik niet wil zien
(.+?) -> dit is de match die ik zoek (? = non-greedy = zo kort mogelijk =
niet de productnaam bij de sub-cat trekken)
Welk stukje code heb ik nu nodig om te laten zoeken op overzichtpagina's? (zoals http://www.steppinout.nl/heren/lounge-pants.html) en welk stukje code heb ik nu nodig om te laten zoeken op productpagina's? (zoals http://www.steppinout.nl/heren/lounge-pants/lounge-pants-00003220-20.html)
Quote:
4. Product dat direct onder de categorie hangt: ww.domein.nl/categorie/productnaam-roze.html
en ik zie geen verschil tussen
ww.domein.nl/categorie/productnaam-roze.html
en
ww.domein.nl/categorie/roze-producten.html
De eerste zou één product zijn, en de tweede de subcategorie met roze producten.
Maar naar mijn idee is een regex hier overbodig: je weet dat je op de / moet splitten.
Uit het aantal gevonden delen weet je al of het gaat om 1 categorie, of in het geval van 3 delen om een cat/ sub-cat / product combinatie.
Alleen in het geval van 2 delen zul je een lijst met sub-categorieën moeten raadplegen om te zien of het een subcat is, of anders een product.
Waarbij eventuleel nog de combinatie "subcat" horend bij "cat" bekeken kan worden.
@Roy: het is 3x hetzelfde stukje code (preg_match()), alleen aan de hand van het format van de URL geeft ie een array met 2, 3, of 4 "matches" terug (waarbij de 1e - nummer 0 - altijd de volledige match is).
Gewijzigd op 15/11/2017 11:26:09 door Rob Doemaarwat
Toevoeging op 15/11/2017 12:25:41:
maw: je vindt zelf waarschijnlijk je linkjes naar externe sites heel handig, maar die staan vol reclame en andere rotzooi.
Je kunt ook je vraag slimmer stellen.
Als je in je openingspost gewoon het hele verhaal vertelt, krijg je geen oplossingen waar je niets aan hebt. Je oorspronkelijke vraag vermeldt niets over een externe site die iets met die regex moet doen.
Maar je gaat dit niet in 1 regex vangen. Dat wil zeggen: als je onderscheid tussen een product en subcategorie nodig hebt.
Ik ga dan nadenken over drie dingen:
1. Hoe kom ik aan een regex voor de externe site die alleen alles op subcategorieniveau pakt http://www.steppinout.nl/heren/lounge-pants.html
2. Hoe kom ik aan een regex voor de externe site die alle productpagina's onder dat subcategorieniveau pakt: http://www.steppinout.nl/heren/lounge-pants/lounge-pants-00003220-20.html
Daarmee zou ik dan ook heel blij zijn.
en
3. Waarom inderdaad die Japanse vrouwen.. Denk dat ik daar wel wat van kan vinden :)
Het lastige is alleen dat je niet een eenduidige url hebt.
Maar maakt dat uit voor de site waar je die regex moet invullen?
Als een productpagina altijd barst van de nummers op het eind, dan kun je daar met een reg-ex ook nog wel weer wat mee.
Ik had verwacht/of gehoopt dat ik een simpel stukje tekst zou krijgen, copy paste klaar. Maar zo werkt het helaas niet kom ik nu achter.
Ik kan geen plaatjes bijvoegen op dit forum vandaar dat ik dat plaatje met zo'n prtscrn linkje laat zien steeds (daar staat dan inderdaad reclame bij).
Maar er staat dus "Enter page URL - URL Regular Expression" en dan 1 klein invulveld met daarin "e.g. \/pages\/[^\/]+
In ieder geval dank voor het meedenken!
Toevoeging op 15/11/2017 13:27:15:
Rob Doemaarwat op 15/11/2017 13:11:45:
Als een productpagina altijd barst van de nummers op het eind, dan kun je daar met een reg-ex ook nog wel weer wat mee.
Nee, kan je niet vanuit gaan helaas.. Dit gaat om het analyseren van bezoekersgedrag op specifieke pagina's. Ik laat de tool data verzamelen van categoriepagina's en van productpagina's. Beiden hebben een andere functie en oop beiden gedragen bezoekers zich anders. Met die regex vertel ik de tool wat wat is. Het hoeft ook niet compleet te zijn, zolang ze maar niet door elkaar heen lopen.
Als dat niet de spuigaten uitloopt, kun je mogelijk die nog expliciet noemen in de regex
ik zou het om willen draaien, hoeveel kan ik er kwijt? Ik heb er +- 40, maar als ik er 10 kwijt kan is dat beter dan niets. Hoe minder ik er kwijt kan hoe langer het duurt voor ik data heb, maar het werkt wel.
Alle requests leiden dan naar 1 pagina dankzij wat instellingen in de .htaccess. Laten we zeggen dat alle request naar index.php leiden waarin je een router zijn werk laat doen om de URL te ontleden en te beslissen welke controller/method er aangeroepen moet worden. In de controller laadt je dan uiteindelijk je data en je template.
Je zou dan ongeveer deze routes krijgen:
Code (php)
1
2
3
4
2
3
4
/{category} ==> ProductController::ShowCategory()
/{category}/{product} ==> ProductController::showProduct()
/{category}/{subcategory} ==> ProductController::ShowSubcategory()
/{category}/{subcategory}/{product} ==> ProductController::showProduct()
/{category}/{product} ==> ProductController::showProduct()
/{category}/{subcategory} ==> ProductController::ShowSubcategory()
/{category}/{subcategory}/{product} ==> ProductController::showProduct()
De volgorde waarin je de routes behandeld is heel belangrijk en zal bepalen welke route voorrang krijgt.
Stel:
ww.domein.nl/etenswaar/brood
Is brood dan een artikel of is het een subcategory ? Zou allebei kunnen toch?
Laat je nu de router de route /{category}/{product} als eerst behandelen dan zal die matchen en wordt de showProduct() method aangeroepen en dus een productpagina geladen.
Verander je de volgorde van de routes, bijvoorbeeld:
Code (php)
1
2
2
/{category}/{subcategory} ==> ProductController::ShowSubcategory()
/{category}/{product} ==> ProductController::showProduct()
/{category}/{product} ==> ProductController::showProduct()
dan zal hij eerst /{category}/{subcategory} pakken en wordt de ShowSubcategory() aangeroepen in plaats van showProductWithCategory()
Hoe kom je aan zo een systeem? Het handigste is om een kant en klaar framework te pakken. Bijvoorbeeld CakePHP.