Edit File by line

Deprecated: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in /home/sportsfever/public_html/filemanger/function.php on line 93

Warning: Undefined array key "page_file_edit_line" in /home/sportsfever/public_html/filemanger/edit_text_line.php on line 32
/home/sportsfe.../httpdocs/wp-conte.../plugins/embedpre.../EmbedPre...
File: simple_html_dom.php
return $ret;
[500] Fix | Delete
}
[501] Fix | Delete
[502] Fix | Delete
function xmltext()
[503] Fix | Delete
{
[504] Fix | Delete
$ret = $this->innertext();
[505] Fix | Delete
$ret = str_ireplace('<![CDATA[', '', $ret);
[506] Fix | Delete
$ret = str_replace(']]>', '', $ret);
[507] Fix | Delete
return $ret;
[508] Fix | Delete
}
[509] Fix | Delete
[510] Fix | Delete
function makeup()
[511] Fix | Delete
{
[512] Fix | Delete
// text, comment, unknown
[513] Fix | Delete
if (isset($this->_[HDOM_INFO_TEXT])) {
[514] Fix | Delete
return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]);
[515] Fix | Delete
}
[516] Fix | Delete
[517] Fix | Delete
$ret = '<' . $this->tag;
[518] Fix | Delete
$i = -1;
[519] Fix | Delete
[520] Fix | Delete
foreach ($this->attr as $key => $val) {
[521] Fix | Delete
++$i;
[522] Fix | Delete
[523] Fix | Delete
// skip removed attribute
[524] Fix | Delete
if ($val === null || $val === false) { continue; }
[525] Fix | Delete
[526] Fix | Delete
$ret .= $this->_[HDOM_INFO_SPACE][$i][0];
[527] Fix | Delete
[528] Fix | Delete
//no value attr: nowrap, checked selected...
[529] Fix | Delete
if ($val === true) {
[530] Fix | Delete
$ret .= $key;
[531] Fix | Delete
} else {
[532] Fix | Delete
switch ($this->_[HDOM_INFO_QUOTE][$i])
[533] Fix | Delete
{
[534] Fix | Delete
case HDOM_QUOTE_DOUBLE: $quote = '"'; break;
[535] Fix | Delete
case HDOM_QUOTE_SINGLE: $quote = '\''; break;
[536] Fix | Delete
default: $quote = '';
[537] Fix | Delete
}
[538] Fix | Delete
[539] Fix | Delete
$ret .= $key
[540] Fix | Delete
. $this->_[HDOM_INFO_SPACE][$i][1]
[541] Fix | Delete
. '='
[542] Fix | Delete
. $this->_[HDOM_INFO_SPACE][$i][2]
[543] Fix | Delete
. $quote
[544] Fix | Delete
. $val
[545] Fix | Delete
. $quote;
[546] Fix | Delete
}
[547] Fix | Delete
}
[548] Fix | Delete
[549] Fix | Delete
$ret = $this->dom->restore_noise($ret);
[550] Fix | Delete
return $ret . $this->_[HDOM_INFO_ENDSPACE] . '>';
[551] Fix | Delete
}
[552] Fix | Delete
[553] Fix | Delete
function find($selector, $idx = null, $lowercase = false)
[554] Fix | Delete
{
[555] Fix | Delete
$selectors = $this->parse_selector($selector);
[556] Fix | Delete
if (($count = count($selectors)) === 0) { return array(); }
[557] Fix | Delete
$found_keys = array();
[558] Fix | Delete
[559] Fix | Delete
// find each selector
[560] Fix | Delete
for ($c = 0; $c < $count; ++$c) {
[561] Fix | Delete
// The change on the below line was documented on the sourceforge
[562] Fix | Delete
// code tracker id 2788009
[563] Fix | Delete
// used to be: if (($levle=count($selectors[0]))===0) return array();
[564] Fix | Delete
if (($levle = count($selectors[$c])) === 0) { return array(); }
[565] Fix | Delete
if (!isset($this->_[HDOM_INFO_BEGIN])) { return array(); }
[566] Fix | Delete
[567] Fix | Delete
$head = array($this->_[HDOM_INFO_BEGIN] => 1);
[568] Fix | Delete
$cmd = ' '; // Combinator
[569] Fix | Delete
[570] Fix | Delete
// handle descendant selectors, no recursive!
[571] Fix | Delete
for ($l = 0; $l < $levle; ++$l) {
[572] Fix | Delete
$ret = array();
[573] Fix | Delete
[574] Fix | Delete
foreach ($head as $k => $v) {
[575] Fix | Delete
$n = ($k === -1) ? $this->dom->root : $this->dom->nodes[$k];
[576] Fix | Delete
//PaperG - Pass this optional parameter on to the seek function.
[577] Fix | Delete
$n->seek($selectors[$c][$l], $ret, $cmd, $lowercase);
[578] Fix | Delete
}
[579] Fix | Delete
[580] Fix | Delete
$head = $ret;
[581] Fix | Delete
$cmd = $selectors[$c][$l][4]; // Next Combinator
[582] Fix | Delete
}
[583] Fix | Delete
[584] Fix | Delete
foreach ($head as $k => $v) {
[585] Fix | Delete
if (!isset($found_keys[$k])) {
[586] Fix | Delete
$found_keys[$k] = 1;
[587] Fix | Delete
}
[588] Fix | Delete
}
[589] Fix | Delete
}
[590] Fix | Delete
[591] Fix | Delete
// sort keys
[592] Fix | Delete
ksort($found_keys);
[593] Fix | Delete
[594] Fix | Delete
$found = array();
[595] Fix | Delete
foreach ($found_keys as $k => $v) {
[596] Fix | Delete
$found[] = $this->dom->nodes[$k];
[597] Fix | Delete
}
[598] Fix | Delete
[599] Fix | Delete
// return nth-element or array
[600] Fix | Delete
if (is_null($idx)) { return $found; }
[601] Fix | Delete
elseif ($idx < 0) { $idx = count($found) + $idx; }
[602] Fix | Delete
return (isset($found[$idx])) ? $found[$idx] : null;
[603] Fix | Delete
}
[604] Fix | Delete
[605] Fix | Delete
protected function seek($selector, &$ret, $parent_cmd, $lowercase = false)
[606] Fix | Delete
{
[607] Fix | Delete
global $debug_object;
[608] Fix | Delete
if (is_object($debug_object)) { $debug_object->debug_log_entry(1); }
[609] Fix | Delete
[610] Fix | Delete
list($tag, $id, $class, $attributes, $cmb) = $selector;
[611] Fix | Delete
$nodes = array();
[612] Fix | Delete
[613] Fix | Delete
if ($parent_cmd === ' ') { // Descendant Combinator
[614] Fix | Delete
// Find parent closing tag if the current element doesn't have a closing
[615] Fix | Delete
// tag (i.e. void element)
[616] Fix | Delete
$end = (!empty($this->_[HDOM_INFO_END])) ? $this->_[HDOM_INFO_END] : 0;
[617] Fix | Delete
if ($end == 0) {
[618] Fix | Delete
$parent = $this->parent;
[619] Fix | Delete
while (!isset($parent->_[HDOM_INFO_END]) && $parent !== null) {
[620] Fix | Delete
$end -= 1;
[621] Fix | Delete
$parent = $parent->parent;
[622] Fix | Delete
}
[623] Fix | Delete
$end += $parent->_[HDOM_INFO_END];
[624] Fix | Delete
}
[625] Fix | Delete
[626] Fix | Delete
// Get list of target nodes
[627] Fix | Delete
$nodes_start = $this->_[HDOM_INFO_BEGIN] + 1;
[628] Fix | Delete
$nodes_count = $end - $nodes_start;
[629] Fix | Delete
$nodes = array_slice($this->dom->nodes, $nodes_start, $nodes_count, true);
[630] Fix | Delete
} elseif ($parent_cmd === '>') { // Child Combinator
[631] Fix | Delete
$nodes = $this->children;
[632] Fix | Delete
} elseif ($parent_cmd === '+'
[633] Fix | Delete
&& $this->parent
[634] Fix | Delete
&& in_array($this, $this->parent->children)) { // Next-Sibling Combinator
[635] Fix | Delete
$index = array_search($this, $this->parent->children, true) + 1;
[636] Fix | Delete
if ($index < count($this->parent->children))
[637] Fix | Delete
$nodes[] = $this->parent->children[$index];
[638] Fix | Delete
} elseif ($parent_cmd === '~'
[639] Fix | Delete
&& $this->parent
[640] Fix | Delete
&& in_array($this, $this->parent->children)) { // Subsequent Sibling Combinator
[641] Fix | Delete
$index = array_search($this, $this->parent->children, true);
[642] Fix | Delete
$nodes = array_slice($this->parent->children, $index);
[643] Fix | Delete
}
[644] Fix | Delete
[645] Fix | Delete
// Go throgh each element starting at this element until the end tag
[646] Fix | Delete
// Note: If this element is a void tag, any previous void element is
[647] Fix | Delete
// skipped.
[648] Fix | Delete
foreach($nodes as $node) {
[649] Fix | Delete
$pass = true;
[650] Fix | Delete
[651] Fix | Delete
// Skip root nodes
[652] Fix | Delete
if(!$node->parent) {
[653] Fix | Delete
$pass = false;
[654] Fix | Delete
}
[655] Fix | Delete
[656] Fix | Delete
// Handle 'text' selector
[657] Fix | Delete
if($pass && $tag === 'text' && $node->tag === 'text') {
[658] Fix | Delete
$ret[array_search($node, $this->dom->nodes, true)] = 1;
[659] Fix | Delete
unset($node);
[660] Fix | Delete
continue;
[661] Fix | Delete
}
[662] Fix | Delete
[663] Fix | Delete
// Skip if node isn't a child node (i.e. text nodes)
[664] Fix | Delete
if($pass && !in_array($node, $node->parent->children, true)) {
[665] Fix | Delete
$pass = false;
[666] Fix | Delete
}
[667] Fix | Delete
[668] Fix | Delete
// Skip if tag doesn't match
[669] Fix | Delete
if ($pass && $tag !== '' && $tag !== $node->tag && $tag !== '*') {
[670] Fix | Delete
$pass = false;
[671] Fix | Delete
}
[672] Fix | Delete
[673] Fix | Delete
// Skip if ID doesn't exist
[674] Fix | Delete
if ($pass && $id !== '' && !isset($node->attr['id'])) {
[675] Fix | Delete
$pass = false;
[676] Fix | Delete
}
[677] Fix | Delete
[678] Fix | Delete
// Check if ID matches
[679] Fix | Delete
if ($pass && $id !== '' && isset($node->attr['id'])) {
[680] Fix | Delete
// Note: Only consider the first ID (as browsers do)
[681] Fix | Delete
$node_id = explode(' ', trim($node->attr['id']))[0];
[682] Fix | Delete
[683] Fix | Delete
if($id !== $node_id) { $pass = false; }
[684] Fix | Delete
}
[685] Fix | Delete
[686] Fix | Delete
// Check if all class(es) exist
[687] Fix | Delete
if ($pass && $class !== '' && is_array($class) && !empty($class)) {
[688] Fix | Delete
if (isset($node->attr['class'])) {
[689] Fix | Delete
$node_classes = explode(' ', $node->attr['class']);
[690] Fix | Delete
[691] Fix | Delete
if ($lowercase) {
[692] Fix | Delete
$node_classes = array_map('strtolower', $node_classes);
[693] Fix | Delete
}
[694] Fix | Delete
[695] Fix | Delete
foreach($class as $c) {
[696] Fix | Delete
if(!in_array($c, $node_classes)) {
[697] Fix | Delete
$pass = false;
[698] Fix | Delete
break;
[699] Fix | Delete
}
[700] Fix | Delete
}
[701] Fix | Delete
} else {
[702] Fix | Delete
$pass = false;
[703] Fix | Delete
}
[704] Fix | Delete
}
[705] Fix | Delete
[706] Fix | Delete
// Check attributes
[707] Fix | Delete
if ($pass
[708] Fix | Delete
&& $attributes !== ''
[709] Fix | Delete
&& is_array($attributes)
[710] Fix | Delete
&& !empty($attributes)) {
[711] Fix | Delete
foreach($attributes as $a) {
[712] Fix | Delete
list (
[713] Fix | Delete
$att_name,
[714] Fix | Delete
$att_expr,
[715] Fix | Delete
$att_val,
[716] Fix | Delete
$att_inv,
[717] Fix | Delete
$att_case_sensitivity
[718] Fix | Delete
) = $a;
[719] Fix | Delete
[720] Fix | Delete
// Handle indexing attributes (i.e. "[2]")
[721] Fix | Delete
/**
[722] Fix | Delete
* Note: This is not supported by the CSS Standard but adds
[723] Fix | Delete
* the ability to select items compatible to XPath (i.e.
[724] Fix | Delete
* the 3rd element within it's parent).
[725] Fix | Delete
*
[726] Fix | Delete
* Note: This doesn't conflict with the CSS Standard which
[727] Fix | Delete
* doesn't work on numeric attributes anyway.
[728] Fix | Delete
*/
[729] Fix | Delete
if (is_numeric($att_name)
[730] Fix | Delete
&& $att_expr === ''
[731] Fix | Delete
&& $att_val === '') {
[732] Fix | Delete
$count = 0;
[733] Fix | Delete
[734] Fix | Delete
// Find index of current element in parent
[735] Fix | Delete
foreach ($node->parent->children as $c) {
[736] Fix | Delete
if ($c->tag === $node->tag) ++$count;
[737] Fix | Delete
if ($c === $node) break;
[738] Fix | Delete
}
[739] Fix | Delete
[740] Fix | Delete
// If this is the correct node, continue with next
[741] Fix | Delete
// attribute
[742] Fix | Delete
if ($count === (int)$att_name) continue;
[743] Fix | Delete
}
[744] Fix | Delete
[745] Fix | Delete
// Check attribute availability
[746] Fix | Delete
if ($att_inv) { // Attribute should NOT be set
[747] Fix | Delete
if (isset($node->attr[$att_name])) {
[748] Fix | Delete
$pass = false;
[749] Fix | Delete
break;
[750] Fix | Delete
}
[751] Fix | Delete
} else { // Attribute should be set
[752] Fix | Delete
// todo: "plaintext" is not a valid CSS selector!
[753] Fix | Delete
if ($att_name !== 'plaintext'
[754] Fix | Delete
&& !isset($node->attr[$att_name])) {
[755] Fix | Delete
$pass = false;
[756] Fix | Delete
break;
[757] Fix | Delete
}
[758] Fix | Delete
}
[759] Fix | Delete
[760] Fix | Delete
// Continue with next attribute if expression isn't defined
[761] Fix | Delete
if ($att_expr === '') continue;
[762] Fix | Delete
[763] Fix | Delete
// If they have told us that this is a "plaintext"
[764] Fix | Delete
// search then we want the plaintext of the node - right?
[765] Fix | Delete
// todo "plaintext" is not a valid CSS selector!
[766] Fix | Delete
if ($att_name === 'plaintext') {
[767] Fix | Delete
$nodeKeyValue = $node->text();
[768] Fix | Delete
} else {
[769] Fix | Delete
$nodeKeyValue = $node->attr[$att_name];
[770] Fix | Delete
}
[771] Fix | Delete
[772] Fix | Delete
if (is_object($debug_object)) {
[773] Fix | Delete
$debug_object->debug_log(2,
[774] Fix | Delete
'testing node: '
[775] Fix | Delete
. $node->tag
[776] Fix | Delete
. ' for attribute: '
[777] Fix | Delete
. $att_name
[778] Fix | Delete
. $att_expr
[779] Fix | Delete
. $att_val
[780] Fix | Delete
. ' where nodes value is: '
[781] Fix | Delete
. $nodeKeyValue
[782] Fix | Delete
);
[783] Fix | Delete
}
[784] Fix | Delete
[785] Fix | Delete
// If lowercase is set, do a case insensitive test of
[786] Fix | Delete
// the value of the selector.
[787] Fix | Delete
if ($lowercase) {
[788] Fix | Delete
$check = $this->match(
[789] Fix | Delete
$att_expr,
[790] Fix | Delete
strtolower($att_val),
[791] Fix | Delete
strtolower($nodeKeyValue),
[792] Fix | Delete
$att_case_sensitivity
[793] Fix | Delete
);
[794] Fix | Delete
} else {
[795] Fix | Delete
$check = $this->match(
[796] Fix | Delete
$att_expr,
[797] Fix | Delete
$att_val,
[798] Fix | Delete
$nodeKeyValue,
[799] Fix | Delete
$att_case_sensitivity
[800] Fix | Delete
);
[801] Fix | Delete
}
[802] Fix | Delete
[803] Fix | Delete
if (is_object($debug_object)) {
[804] Fix | Delete
$debug_object->debug_log(2,
[805] Fix | Delete
'after match: '
[806] Fix | Delete
. ($check ? 'true' : 'false')
[807] Fix | Delete
);
[808] Fix | Delete
}
[809] Fix | Delete
[810] Fix | Delete
if (!$check) {
[811] Fix | Delete
$pass = false;
[812] Fix | Delete
break;
[813] Fix | Delete
}
[814] Fix | Delete
}
[815] Fix | Delete
}
[816] Fix | Delete
[817] Fix | Delete
// Found a match. Add to list and clear node
[818] Fix | Delete
if ($pass) $ret[$node->_[HDOM_INFO_BEGIN]] = 1;
[819] Fix | Delete
unset($node);
[820] Fix | Delete
}
[821] Fix | Delete
// It's passed by reference so this is actually what this function returns.
[822] Fix | Delete
if (is_object($debug_object)) {
[823] Fix | Delete
$debug_object->debug_log(1, 'EXIT - ret: ', $ret);
[824] Fix | Delete
}
[825] Fix | Delete
}
[826] Fix | Delete
[827] Fix | Delete
protected function match($exp, $pattern, $value, $case_sensitivity)
[828] Fix | Delete
{
[829] Fix | Delete
global $debug_object;
[830] Fix | Delete
if (is_object($debug_object)) {$debug_object->debug_log_entry(1);}
[831] Fix | Delete
[832] Fix | Delete
if ($case_sensitivity === 'i') {
[833] Fix | Delete
$pattern = strtolower($pattern);
[834] Fix | Delete
$value = strtolower($value);
[835] Fix | Delete
}
[836] Fix | Delete
[837] Fix | Delete
switch ($exp) {
[838] Fix | Delete
case '=':
[839] Fix | Delete
return ($value === $pattern);
[840] Fix | Delete
case '!=':
[841] Fix | Delete
return ($value !== $pattern);
[842] Fix | Delete
case '^=':
[843] Fix | Delete
return preg_match('/^' . preg_quote($pattern, '/') . '/', $value);
[844] Fix | Delete
case '$=':
[845] Fix | Delete
return preg_match('/' . preg_quote($pattern, '/') . '$/', $value);
[846] Fix | Delete
case '*=':
[847] Fix | Delete
return preg_match('/' . preg_quote($pattern, '/') . '/', $value);
[848] Fix | Delete
case '|=':
[849] Fix | Delete
/**
[850] Fix | Delete
* [att|=val]
[851] Fix | Delete
*
[852] Fix | Delete
* Represents an element with the att attribute, its value
[853] Fix | Delete
* either being exactly "val" or beginning with "val"
[854] Fix | Delete
* immediately followed by "-" (U+002D).
[855] Fix | Delete
*/
[856] Fix | Delete
return strpos($value, $pattern) === 0;
[857] Fix | Delete
case '~=':
[858] Fix | Delete
/**
[859] Fix | Delete
* [att~=val]
[860] Fix | Delete
*
[861] Fix | Delete
* Represents an element with the att attribute whose value is a
[862] Fix | Delete
* whitespace-separated list of words, one of which is exactly
[863] Fix | Delete
* "val". If "val" contains whitespace, it will never represent
[864] Fix | Delete
* anything (since the words are separated by spaces). Also if
[865] Fix | Delete
* "val" is the empty string, it will never represent anything.
[866] Fix | Delete
*/
[867] Fix | Delete
return in_array($pattern, explode(' ', trim($value)), true);
[868] Fix | Delete
}
[869] Fix | Delete
return false;
[870] Fix | Delete
}
[871] Fix | Delete
[872] Fix | Delete
protected function parse_selector($selector_string)
[873] Fix | Delete
{
[874] Fix | Delete
global $debug_object;
[875] Fix | Delete
if (is_object($debug_object)) { $debug_object->debug_log_entry(1); }
[876] Fix | Delete
[877] Fix | Delete
/**
[878] Fix | Delete
* Pattern of CSS selectors, modified from mootools (https://mootools.net/)
[879] Fix | Delete
*
[880] Fix | Delete
* Paperg: Add the colon to the attribute, so that it properly finds
[881] Fix | Delete
* <tag attr:ibute="something" > like google does.
[882] Fix | Delete
*
[883] Fix | Delete
* Note: if you try to look at this attribute, you MUST use getAttribute
[884] Fix | Delete
* since $dom->x:y will fail the php syntax check.
[885] Fix | Delete
*
[886] Fix | Delete
* Notice the \[ starting the attribute? and the @? following? This
[887] Fix | Delete
* implies that an attribute can begin with an @ sign that is not
[888] Fix | Delete
* captured. This implies that an html attribute specifier may start
[889] Fix | Delete
* with an @ sign that is NOT captured by the expression. Farther study
[890] Fix | Delete
* is required to determine of this should be documented or removed.
[891] Fix | Delete
*
[892] Fix | Delete
* Matches selectors in this order:
[893] Fix | Delete
*
[894] Fix | Delete
* [0] - full match
[895] Fix | Delete
*
[896] Fix | Delete
* [1] - tag name
[897] Fix | Delete
* ([\w:\*-]*)
[898] Fix | Delete
* Matches the tag name consisting of zero or more words, colons,
[899] Fix | Delete
* asterisks and hyphens.
[900] Fix | Delete
*
[901] Fix | Delete
* [2] - id name
[902] Fix | Delete
* (?:\#([\w-]+))
[903] Fix | Delete
* Optionally matches a id name, consisting of an "#" followed by
[904] Fix | Delete
* the id name (one or more words and hyphens).
[905] Fix | Delete
*
[906] Fix | Delete
* [3] - class names (including dots)
[907] Fix | Delete
* (?:\.([\w\.-]+))?
[908] Fix | Delete
* Optionally matches a list of classs, consisting of an "."
[909] Fix | Delete
* followed by the class name (one or more words and hyphens)
[910] Fix | Delete
* where multiple classes can be chained (i.e. ".foo.bar.baz")
[911] Fix | Delete
*
[912] Fix | Delete
* [4] - attributes
[913] Fix | Delete
* ((?:\[@?(?:!?[\w:-]+)(?:(?:[!*^$|~]?=)[\"']?(?:.*?)[\"']?)?(?:\s*?(?:[iIsS])?)?\])+)?
[914] Fix | Delete
* Optionally matches the attributes list
[915] Fix | Delete
*
[916] Fix | Delete
* [5] - separator
[917] Fix | Delete
* ([\/, >+~]+)
[918] Fix | Delete
* Matches the selector list separator
[919] Fix | Delete
*/
[920] Fix | Delete
// phpcs:ignore Generic.Files.LineLength
[921] Fix | Delete
$pattern = "/([\w:\*-]*)(?:\#([\w-]+))?(?:|\.([\w\.-]+))?((?:\[@?(?:!?[\w:-]+)(?:(?:[!*^$|~]?=)[\"']?(?:.*?)[\"']?)?(?:\s*?(?:[iIsS])?)?\])+)?([\/, >+~]+)/is";
[922] Fix | Delete
[923] Fix | Delete
preg_match_all(
[924] Fix | Delete
$pattern,
[925] Fix | Delete
trim($selector_string) . ' ', // Add final ' ' as pseudo separator
[926] Fix | Delete
$matches,
[927] Fix | Delete
PREG_SET_ORDER
[928] Fix | Delete
);
[929] Fix | Delete
[930] Fix | Delete
if (is_object($debug_object)) {
[931] Fix | Delete
$debug_object->debug_log(2, 'Matches Array: ', $matches);
[932] Fix | Delete
}
[933] Fix | Delete
[934] Fix | Delete
$selectors = array();
[935] Fix | Delete
$result = array();
[936] Fix | Delete
[937] Fix | Delete
foreach ($matches as $m) {
[938] Fix | Delete
$m[0] = trim($m[0]);
[939] Fix | Delete
[940] Fix | Delete
// Skip NoOps
[941] Fix | Delete
if ($m[0] === '' || $m[0] === '/' || $m[0] === '//') { continue; }
[942] Fix | Delete
[943] Fix | Delete
// Convert to lowercase
[944] Fix | Delete
if ($this->dom->lowercase) {
[945] Fix | Delete
$m[1] = strtolower($m[1]);
[946] Fix | Delete
}
[947] Fix | Delete
[948] Fix | Delete
// Extract classes
[949] Fix | Delete
if ($m[3] !== '') { $m[3] = explode('.', $m[3]); }
[950] Fix | Delete
[951] Fix | Delete
/* Extract attributes (pattern based on the pattern above!)
[952] Fix | Delete
[953] Fix | Delete
* [0] - full match
[954] Fix | Delete
* [1] - attribute name
[955] Fix | Delete
* [2] - attribute expression
[956] Fix | Delete
* [3] - attribute value
[957] Fix | Delete
* [4] - case sensitivity
[958] Fix | Delete
*
[959] Fix | Delete
* Note: Attributes can be negated with a "!" prefix to their name
[960] Fix | Delete
*/
[961] Fix | Delete
if($m[4] !== '') {
[962] Fix | Delete
preg_match_all(
[963] Fix | Delete
"/\[@?(!?[\w:-]+)(?:([!*^$|~]?=)[\"']?(.*?)[\"']?)?(?:\s+?([iIsS])?)?\]/is",
[964] Fix | Delete
trim($m[4]),
[965] Fix | Delete
$attributes,
[966] Fix | Delete
PREG_SET_ORDER
[967] Fix | Delete
);
[968] Fix | Delete
[969] Fix | Delete
// Replace element by array
[970] Fix | Delete
$m[4] = array();
[971] Fix | Delete
[972] Fix | Delete
foreach($attributes as $att) {
[973] Fix | Delete
// Skip empty matches
[974] Fix | Delete
if(trim($att[0]) === '') { continue; }
[975] Fix | Delete
[976] Fix | Delete
$inverted = (isset($att[1][0]) && $att[1][0] === '!');
[977] Fix | Delete
$m[4][] = array(
[978] Fix | Delete
$inverted ? substr($att[1], 1) : $att[1], // Name
[979] Fix | Delete
(isset($att[2])) ? $att[2] : '', // Expression
[980] Fix | Delete
(isset($att[3])) ? $att[3] : '', // Value
[981] Fix | Delete
$inverted, // Inverted Flag
[982] Fix | Delete
(isset($att[4])) ? strtolower($att[4]) : '', // Case-Sensitivity
[983] Fix | Delete
);
[984] Fix | Delete
}
[985] Fix | Delete
}
[986] Fix | Delete
[987] Fix | Delete
// Sanitize Separator
[988] Fix | Delete
if ($m[5] !== '' && trim($m[5]) === '') { // Descendant Separator
[989] Fix | Delete
$m[5] = ' ';
[990] Fix | Delete
} else { // Other Separator
[991] Fix | Delete
$m[5] = trim($m[5]);
[992] Fix | Delete
}
[993] Fix | Delete
[994] Fix | Delete
// Clear Separator if it's a Selector List
[995] Fix | Delete
if ($is_list = ($m[5] === ',')) { $m[5] = ''; }
[996] Fix | Delete
[997] Fix | Delete
// Remove full match before adding to results
[998] Fix | Delete
array_shift($m);
[999] Fix | Delete
It is recommended that you Edit text format, this type of Fix handles quite a lot in one request
Function