Удалить http: из img src

С помощью php возможно ли удалить протокол http: из img src?

Так что img src будет:

<img src="//www.example.com/image.jpg" />

вместо

<img src="http://www.example.com/image.jpg" />

Будет ли str_replace хорошим вариантом здесь? Я знаю, что могу определить:

$contentImg = str_replace(array('http', 'https'), '', $filter);

Я просто не уверен, как определить $ фильтр.

2

Решение

При условии, что $filter работает нормально и если источник выбран правильно, вы также можете использовать регулярное выражение replace:

$contentImg = preg_replace('/^https?:/','', $string);

'/^https?:/' здесь регулярное выражение:
^ символ означает начало строки, так что вы удаляете только потенциальные протоколы спереди.
? это специальный символ, который указывает, что s не является обязательным. Таким образом, он будет соответствовать обоим http: а также https:,

Используя регулярные выражения, вы можете написать несколько запросов более компактными. Скажите (ради ответа), что вы также хотите удалить ftp а также sftp, ты можешь использовать:

'/^(https?|s?ftp):/'

поскольку | средства или же и скобки предназначены для группировки.

Вы также забыли удалить двоеточие (:).

Я, однако, больше беспокоюсь о том, что ваш $filter будет содержать весь исходный код страницы. В этом случае это может принести больше вреда, чем пользы, так как текст, содержащий http: также может быть удален. Для анализа и обработки XML / HTML лучше использовать DOMParser, Это приведет к некоторым накладным расходам, но, как утверждают некоторые разработчики программного обеспечения: «Разработка программного обеспечения — это разработка систем против дураков, в настоящее время вселенная производит все больше и больше дураков, поэтому небольшая дополнительная нагрузка оправдана».

Пример:

Вам определенно следует использовать DOMParser, как указано выше (поскольку такой подход более безопасен):

$dom = new DOMDocument;
$dom->loadHTML($html); //$html is the input of the document
foreach ($dom->getElementsByTagName('img') as $image) {
$image->setAttribute('src',preg_replace('/^https?:/','',$image->getAttribute('src')));
}
$html = $dom->saveHTML(); //html no stores the new version

(работает это в php -a дает ожидаемый результат для вашего тестового примера).

Или на этапе постобработки:

$html = get_the_content();
$dom = new DOMDocument;
$dom->loadHTML($html); //$html is the input of the document
foreach ($dom->getElementsByTagName('img') as $image) {
$image->setAttribute('src',preg_replace('/^https?:/','',$image->getAttribute('src')));
}
$html = $dom->saveHTML();
echo $html;

Спектакль:

Были проведены тесты на производительность с использованием php -a интерактивная оболочка (1'000'000 экземпляры):

$ php -a
php > $timea=microtime(true); for($i = 0; $i < 10000000; $i++) { str_replace(array('http:', 'https:'), '', 'http://www.google.com'); }; echo (microtime(true)-$timea);  echo "\n";
5.4192590713501
php > $timea=microtime(true); for($i = 0; $i < 10000000; $i++) { preg_replace('/^https?:/','', 'http://www.google.com'); }; echo (microtime(true)-$timea);  echo "\n";
5.986407995224
php > $timea=microtime(true); for($i = 0; $i < 10000000; $i++) { preg_replace('/https?:/','', 'http://www.google.com'); }; echo (microtime(true)-$timea);  echo "\n";
5.8694758415222
php > $timea=microtime(true); for($i = 0; $i < 10000000; $i++) { preg_replace('/(https?|s?ftp):/','', 'http://www.google.com'); }; echo (microtime(true)-$timea);  echo "\n";
6.0902049541473
php > $timea=microtime(true); for($i = 0; $i < 10000000; $i++) { str_replace(array('http:', 'https:','sftp:','ftp:'), '', 'http://www.google.com'); }; echo (microtime(true)-$timea);  echo "\n";
7.2881300449371

Таким образом:

str_replace:           5.4193 s     0.0000054193 s/call
preg_replace (with ^): 5.9864 s     0.0000059864 s/call
preg_replace (no ^):   5.8695 s     0.0000058695 s/call

Для более возможных частей (в том числе sftp а также ftp):

str_replace:           7.2881 s     0.0000072881 s/call
preg_replace (no ^):   6.0902 s     0.0000060902 s/call
1

Другие решения

да уж str_replace is where it's at, Это будет ссылка на протокол.

<?php echo str_replace(array('http:', 'https:'), '', 'http://www.google.com'); ?>

Выводит

//www.google.com

Это делает, как ожидалось. В противном случае вы можете использовать preg_replace что позволит вам использовать регулярные выражения или регулярные выражения. CommuSoft опубликовал ответ с хорошим примером.

3

По вопросам рекламы [email protected]