Я ищу шаблон preg_match_all, чтобы найти весь URL-адрес на странице, у которой нет косой черты.
Например: если у меня есть
a href = "/ testing / abc /"> конец с косой чертой
a href = "/ testing / test / mnl"> не заканчивается слэш
Результатом будет # 2
Благодарю.
Лучше извлеките все ссылки href с помощью DOM-анализатора и посмотрите, заканчивается ли URL-адрес косой чертой или нет. Для этого не нужно никакого регулярного выражения.
Для решения regex для приведенных примеров вы можете использовать это регулярное выражение:
/href=(['"])[^\s]+(?<!\/)\1/
href= -> match text href= (['"]) -> match single or double quote and create a group #1 with this match [^\s]+ -> match 1 or more character until a space is found (?<!\/) -> (negative lookbehind) only match if is not preceded by / \1 -> match closing single or double quote (group #1)
Действительно, используйте парсер DOM [ почему? ] . Вот пример:
// let's define some HTML $html = <<<'HTML' <html> <head> </head> <body> <a href="/testing/abc/">end with slash</a> <a href="/testing/test/mnl">no ending slash</a> </body> </html> HTML; // create a DOMDocument instance (a DOM parser) $dom = new DOMDocument(); // load the HTML $dom->loadHTML( $html ); // create a DOMXPath instance, to query the DOM $xpath = new DOMXPath( $dom ); // find all nodes containing an href attribute, and return the attribute node $linkNodes = $xpath->query( '//*[@href]/@href' ); // initialize a result array $result = array(); // iterate all found attribute nodes foreach( $linkNodes as $linkNode ) { // does its value not end with a forward slash? if( substr( $linkNode->value, -1 ) !== '/' ) { // add the attribute value to the result array $result[] = $linkNode->value; } } // let's look at the result var_dump( $result );