MySQL REGEXP

PEAR, Smarty, ADOdb, OOP, PHP 5, XML, UML, Şabloane de proiectare, PHP-GTK.

Moderatori: coditza, Emil, Moderatori

Avatar utilizator
virus
Average Member
Mesaje: 153
Membru din: Dum Feb 27, 2011 3:16 pm
Localitate: Timisoara
Contact:

MySQL REGEXP

Mesajde virus » Lun Noi 18, 2013 1:06 pm

Salutare . Am si eu nevoie de ajutor la un regexp.
Am inregistrari salvate in baza de date sub forma de XML , dupa modelul de mai jos.

Cod: Selectaţi tot

  <submission xml:id="id_x515ec84da0ded6.35425957">
    <fields>
      <field>
        <fieldvalue><![CDATA[dds]]></fieldvalue>
        <fieldid>710688</fieldid>
      </field>
      <field>
        <fieldvalue><![CDATA[Romania]]></fieldvalue>
        <fieldid>710689</fieldid>
      </field>
      <field>
        <fieldvalue><![CDATA[]]></fieldvalue>
        <fieldid>710690</fieldid>
      </field>
      <field>
        <fieldvalue><![CDATA[sfs]]></fieldvalue>
        <fieldid>710692-1</fieldid>
      </field>
      <field>
        <fieldvalue><![CDATA[ sd]]></fieldvalue>
        <fieldid>710692-2</fieldid>
      </field>
      <field>
        <fieldvalue><![CDATA[Afghanistan]]></fieldvalue>
        <fieldid>710692-6</fieldid>
      </field>
    </fields>
  </submission>


Am nevoie de un regexp care sa imi caute in xml , de exemplu : daca caut termenul Afganistan si id-ul 710692-6 sa imi returneze true pentru ca am in XML :

Cod: Selectaţi tot

 <field>
        <fieldvalue><![CDATA[Afghanistan]]></fieldvalue>
        <fieldid>710692-6</fieldid>
      </field>


Regexul care il am eu nu stie unde sa se opreasca. De exemplu : Caut Romania in campul cu ID 710692-6. e clar ca nu am asa ceva in xml , dar imi da true , pentru ca gaseste romania si mai jos gaseste si id-ul

asta e codul php

Cod: Selectaţi tot

$searchfinal .= " AND LOWER(CONVERT(`x_xml` USING latin1)) $qlike \"(?![ ,\t]*<fieldvalue><!\\\\[cdata\\\\[$)(.*$query([^(?!\\\\$)]*))\\\\]\\\\]></fieldvalue>\n[ ,\t]*<fieldid>$field_id</fieldid>\"";

$qlike = REGEXP sau NOT REGEXP
$query = termenul care il caut
$field_id = id-ul campului in care il caut


echo ($busy === TRUE) ? "F**k Off" : "Hello. Can I help You?" ;

Avatar utilizator
socu
Senior Member
Mesaje: 470
Membru din: Mie Apr 22, 2009 11:05 pm
Localitate: Marghita

Re: MySQL REGEXP

Mesajde socu » Mar Noi 19, 2013 4:53 pm

Cod: Selectaţi tot

$searchfinal .= " AND LOWER(CONVERT(`x_xml` USING latin1)) $qlike '<field>[[:space:]]*<fieldvalue><!\\\\[CDATA\\\\[$query\\\\]\\\\]></fieldvalue>[[:space:]]*<fieldid>$field_id</fieldid>[[:space:]]*</field>'";


Ca sa nu mai faci acel convert si lower ai putea direct sa setezi pe latin1 insensitive.

Avatar utilizator
virus
Average Member
Mesaje: 153
Membru din: Dum Feb 27, 2011 3:16 pm
Localitate: Timisoara
Contact:

Re: MySQL REGEXP

Mesajde virus » Mar Noi 19, 2013 10:04 pm

Ce mi-ai dat tu functioneaza doar daca scriu tot cuvantul (cred. nu stiu prea bine regex).
Ar trebui sa functioneze si daca scriu doar "ro" , sau "roman" , sa imi returneze xml-ul care contine si Romania.

Daca pun .*$query.* ca sa mai poata fi orice caracter inainte si dupa stringul dat atunci nu imi merge bine ca am cdata acolo , si daca caut "a" imi gaseste si "a"-ul din cdata , iar ".*" dupa $query imi face regexul sa nu se mai opreasca la "</field>" ci merge mai jos si s-ar putea sa imi gaseasca termenul cautat sus si id-ul mai jos , ceea ce nu e bine.

Cred ca am gasit eu o solutie. Eventual o voi posta maine cand ajung la birou , ca nu am codul acasa :)

Mersi pentru ajutor!
echo ($busy === TRUE) ? "F**k Off" : "Hello. Can I help You?" ;

Avatar utilizator
socu
Senior Member
Mesaje: 470
Membru din: Mie Apr 22, 2009 11:05 pm
Localitate: Marghita

Re: MySQL REGEXP

Mesajde socu » Mie Noi 20, 2013 6:41 pm

Pai ar trebui sa inconjori acel $query cu [a-zA-Z0-9]* sau asemanator

Cod: Selectaţi tot

"...CDATA\\\\[[a-zA-Z0-9]*$query[a-zA-Z0-9]*\\\\]..."


Nu stiu exact de ce ai acel xml in BD dar sigur exista rezolvari mai elegante.

Avatar utilizator
virus
Average Member
Mesaje: 153
Membru din: Dum Feb 27, 2011 3:16 pm
Localitate: Timisoara
Contact:

Re: MySQL REGEXP

Mesajde virus » Mie Noi 20, 2013 8:56 pm

Asta mi-a rezolvat problema :

Cod: Selectaţi tot

$searchfinal=" AND LOWER(CONVERT(`x_xml` USING latin1)) $qlike \"<fieldvalue><!\\\\[cdata\\\\[(([^(?!\!$)]*)$query([^(?!\\\\$)]*))\\\\]\\\\]></fieldvalue>\n[ ,\t]*<fieldid>$field_id</fieldid>\"";


Am in baza de date peste 21 milioane inregistrari (xml-uri de genul ala) in care trebui sa caut. E mai ciudat sistemul :D

Mersi pentru ajutor :D
O seara placuta.
echo ($busy === TRUE) ? "F**k Off" : "Hello. Can I help You?" ;


Înapoi la “PHP Avansat”

Cine este conectat

Utilizatori ce ce navighează pe acest forum: Niciun utilizator înregistrat și 11 vizitatori