Регулярные выражения <link href="(.?)*" or/and media="(.?)*" />

Тема в разделе "PHP", создана пользователем halfhope, 6 сен 2013.

  1. halfhope

    halfhope

    Регистрация:
    31 дек 2012
    Сообщения:
    285
    Симпатии:
    312
    Ребята, помогите с регуляркой
    Есть html
    HTML:
    <link href="http://1551.opencart.im/image/data/cart.png" rel="icon" />
    <link rel="stylesheet" type="text/css" href="catalog/view/theme/default/stylesheet/stylesheet.css" />
    <link rel="stylesheet" type="text/css" href="catalog/view/theme/default/stylesheet/slideshow.css" media="screen" />
    <link rel="stylesheet" type="text/css" href="catalog/view/theme/default/stylesheet/carousel.css" media="screen" />
    <link rel="stylesheet" type="text/css" href="catalog/view/javascript/jquery/ui/themes/ui-lightness/jquery-ui-1.8.16.custom.css" />
    
    И регулярка
    PHP:
    $preg[2] = '/\<link[ a-zA-Z0-9="\/]+(?:type="text\/css")?+[ a-zA-Z0-9="\/]+href="(.+?)"+[ a-zA-Z0-9="\/]+(?:media="(.+?)?")[^>]*\/>/';
    Он удачно находит совпадения только с двумя строками т.е. в которых есть аттрибут media. А если аттрибута нет, или он стоит позади href, тогда он не находит совпадение. Как решить такую проблему? Должен же быть какой-то очень простой выход.
     
  2. Sernuzh

    Sernuzh

    Регистрация:
    6 сен 2013
    Сообщения:
    0
    Симпатии:
    3
    Не понял что именно ищем. Назовите критерий по которому хотите найти совпадение. Если надо все найти то понятно что атрибута media в регулярке быть не должно. А если он есть в регулярке то понятно что те тэги которые его не имеют найдены не будут.
     
    Последнее редактирование: 6 сен 2013
    halfhope нравится это.
  3. halfhope

    halfhope

    Регистрация:
    31 дек 2012
    Сообщения:
    285
    Симпатии:
    312
    Хотел сделать все в одном выражении. Т.е. задача регулярки - загружать только стили(rel="stylesheet" type="text/css"), если есть media, то брать.
    Нашел решение
    PHP:
    $regex '/<link[^>](?:rel=\"stylesheet\")+[ a-zA-Z0-9="\/]+href="(.+?)"+[ a-zA-Z0-9="\/](?:media=\"(.*)?\")?[^>]*\/>/'
    По сути велосипед. Ничего нового, но если порядок аттрибутов в теге другой, то работать не будет(
    Вывод:
    PHP:
    array(3) {
      [
    0]=>
      array(
    4) {
        [
    0]=>
        
    string(101"<link rel="stylesheet" type="text/css" href="catalog/view/theme/default/stylesheet/stylesheet.css" />"
        
    [1]=>
        
    string(115"<link rel="stylesheet" type="text/css" href="catalog/view/theme/default/stylesheet/slideshow.css" media="screen" />"
        
    [2]=>
        
    string(114"<link rel="stylesheet" type="text/css" href="catalog/view/theme/default/stylesheet/carousel.css" media="screen" />"
        
    [3]=>
        
    string(130"<link rel="stylesheet" type="text/css" href="catalog/view/javascript/jquery/ui/themes/ui-lightness/jquery-ui-1.8.16.custom.css" />"
      
    }
      [
    1]=>
      array(
    4) {
        [
    0]=>
        
    string(52"catalog/view/theme/default/stylesheet/stylesheet.css"
        
    [1]=>
        
    string(51"catalog/view/theme/default/stylesheet/slideshow.css"
        
    [2]=>
        
    string(50"catalog/view/theme/default/stylesheet/carousel.css"
        
    [3]=>
        
    string(81"catalog/view/javascript/jquery/ui/themes/ui-lightness/jquery-ui-1.8.16.custom.css"
      
    }
      [
    2]=>
      array(
    4) {
        [
    0]=>
        
    string(0""
        
    [1]=>
        
    string(6"screen"
        
    [2]=>
        
    string(6"screen"
        
    [3]=>
        
    string(0""
      
    }
    }
    А так работает и ладно)
    Sernuzh, спасибо.