С помощью 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);
Я просто не уверен, как определить $ фильтр.
При условии, что $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
да уж str_replace is where it's at
, Это будет ссылка на протокол.
<?php echo str_replace(array('http:', 'https:'), '', 'http://www.google.com'); ?>
Выводит
//www.google.com
Это делает, как ожидалось. В противном случае вы можете использовать preg_replace
что позволит вам использовать регулярные выражения или регулярные выражения. CommuSoft опубликовал ответ с хорошим примером.