Как сопоставить и заменить источник img на «../» - PullRequest
0 голосов
/ 26 апреля 2019

Я хочу удалить любое число «../» в источнике изображения (src).

У меня есть регулярное выражение, которое удаляет «../» и также работает, если его нет »../ 'in source.

<?php

$help_path = 'http:xxx.com/wp-content/help/';
$contents = <<<MYVAR
<img src="Links/WAS_PIC_ControlBox-1-2-3.jpg" alt="WAS-Betjeningsboks-1-2-3" 
style="border: none; margin-left: 20px; margin-right: 0px; margin-top: 0px; margin-bottom: 0px;" border="0">

<img src="../Links/WAS_PIC_ControlBox-1-2-3.jpg" alt="WAS-Betjeningsboks-1-2-3" 
style="border: none; margin-left: 20px; margin-right: 0px; margin-top: 0px; margin-bottom: 0px;" border="0">

<img src="../../Links/WAS_PIC_ControlBox-1-2-3.jpg" alt="WAS-Betjeningsboks-1-2-3" 
style="border: none; margin-left: 20px; margin-right: 0px; margin-top: 0px; margin-bottom: 0px;" border="0">

<script type="text/javascript" src="ehlpdhtm.js"></script>

<script type="text/javascript" src="../ehlpdhtm.js"></script>

<script type="text/javascript" src="../../ehlpdhtm.js"></script>

MYVAR;

$find = array(
    '#<script\s+type="(.*?)"\s+src="(?:\.{2}/)?(.*?)">(.*?)</script>#is',
    '#<img\s+src="(?:\.{2}/)?(.*?)"\s+alt="(.*?)"([^>]*?)/?>#i'
);

$replace = array(
    '<script type="${1}" src="' . $help_path . '${2}"></script>',
    '<img src="' . $help_path . '${1}" alt="${2}"${3} />'
);

$preg_rep = preg_replace($find, $replace, $contents);
print_r($preg_rep);

Проблема в том, что мое регулярное выражение выводит' ../ ', если в src более одного' ../ '.Он всегда должен быть похож на src = "Links / xxx.jpg", независимо от того, сколько '../' в источнике ('../../../../').

<img src="http:xxx.com/wp-content/help/Links/WAS_PIC_ControlBox-1-2-3.jpg" alt="WAS-Betjeningsboks-1-2-3" 
style="border: none; margin-left: 20px; margin-right: 0px; margin-top: 0px; margin-bottom: 0px;" border="0" />

<img src="http:xxx.com/wp-content/help/Links/WAS_PIC_ControlBox-1-2-3.jpg" alt="WAS-Betjeningsboks-1-2-3" 
style="border: none; margin-left: 20px; margin-right: 0px; margin-top: 0px; margin-bottom: 0px;" border="0" />

<img src="http:xxx.com/wp-content/help/../Links/WAS_PIC_ControlBox-1-2-3.jpg" alt="WAS-Betjeningsboks-1-2-3" 
style="border: none; margin-left: 20px; margin-right: 0px; margin-top: 0px; margin-bottom: 0px;" border="0" />

<script type="text/javascript" src="http:xxx.com/wp-content/help/ehlpdhtm.js"></script>

<script type="text/javascript" src="http:xxx.com/wp-content/help/ehlpdhtm.js"></script>

<script type="text/javascript" src="http:xxx.com/wp-content/help/../ehlpdhtm.js"></script>

1 Ответ

1 голос
/ 26 апреля 2019

Вы можете использовать preg_replace, чтобы удалить все ../

$contents = str_replace('../', '', $contents);

и после этого вы можете применить регулярное выражение

$contents = str_replace('../', '', $contents);
$find = array(
  '#<script\s+type="(.*?)"\s+src="(?:\.{2}/)?(.*?)">(.*?)</script>#is',
  '#<img\s+src="(?:\.{2}/)?(.*?)"\s+alt="(.*?)"([^>]*?)/?>#i'
);
$replace = array(
  '<script type="${1}" src="' . $help_path . '${2}"></script>',
  '<img src="' . $help_path . '${1}" alt="${2}"${3} />'
);

$preg_rep = preg_replace($find, $replace, $contents);
...